Удалить правильные подмножества из списка множеств

Как утверждает Джон Скит, нет никакого способа, кроме как использовать отражение.

Однако, если отражение является для вас вариантом, вы можете это сделать.

public static void main(String[] args) {
    System.out.println("please enter a password");
    // don't actually do this, this is an example only.
    Scanner in = new Scanner(System.in);
    String password = in.nextLine();
    usePassword(password);

    clearString(password);

    System.out.println("password: '" + password + "'");
}

private static void usePassword(String password) {

}

private static void clearString(String password) {
    try {
        Field value = String.class.getDeclaredField("value");
        value.setAccessible(true);
        char[] chars = (char[]) value.get(password);
        Arrays.fill(chars, '*');
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

при запуске

please enter a password
hello world
password: '***********'

Примечание: если символ String [] был скопирован как часть цикла GC, есть вероятность, что предыдущая копия находится где-то в памяти.

Эта старая копия не появится в дампе кучи, но если у вас есть прямой доступ к необработанной памяти процесса, вы можете ее увидеть. В общем, вы должны избегать любого, кто имеет такой доступ.

0
задан Kevin Le 27 March 2019 в 01:08
поделиться

1 ответ

Звучит как задание для динамического программирования. Поэтому я не буду представлять вам окончательное решение в коде. Скорее, я дам вам несколько советов.

Обозначим длину списка A как N. Представьте себе матрицу N по N из 1 и 0, обозначенную как X. Если X(i, j) равно 1, это означает, что A[i] является правильным подмножеством A[j], в противном случае 0. Ваша задача - заполнить всю матрицу X с минимальными затратами.

Существует несколько видов логических выводов, которые можно сделать для матрицы X:

  1. X(i, j) == 1 подразумевает X(j, i) == 0
  2. len(A[i]) >= len(A[j]) подразумевает X(i, j) == 0
  3. ]
  4. X(i, j) == 1 and X(j, k) == 1 подразумевает X(i, k) == 1

Ваша задача при разработке алгоритма состоит в том, чтобы упорядочить сравнения таким образом, чтобы количество требуемых сравнений в среднем для заполнения X было минимальным в основном, используя правила выше как можно чаще.

0
ответ дан PM Hui 27 March 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: