#java #algorithm #subset
#java #алгоритм #подмножество
Вопрос:
Итак, алгоритм генерирует подмножества множества A, используя параметр i для ссылки на A[i], на каждом шаге выполняется два вызова, один из которых включает A [i], а другой исключает A [i]. Поиск прекращается, когда i ==n.
Итак, это имеет смысл, но я не могу понять, что здесь делает последнее утверждение..
void search(int i, ArrayList<Integer> subset,ArrayList<Integer> A, int n){
if (i==n) System.out.println(subset);
else{
search(i 1,subset,A,n);
subset.add(A.get(i));
search(i 1,subset,A,n);
subset.remove(subset.size()-1); /*Why do we need to do this? I am not making any function call after this*/
}
}
Я попытался исключить последнее утверждение, но затем оно повторяет элементы в подмножествах. Какая польза от последнего утверждения?
Комментарии:
1. Вы пытаетесь сгенерировать подмножества с помощью обратного отслеживания?
2. @uneq95 да, я знаю, что это не самый эффективный метод.
3. у @MBo есть правильный ответ для вас
Ответ №1:
У вас есть единственный экземпляр subset
, совместно используемый на всех уровнях рекурсии.
Итак, после использования item вы должны вернуться на более низкий уровень с тем же состоянием subset
.
Представьте дерево вызовов
[]
[]
[2] *
[1]
[1]
[1 2]
После того, как вы создали подмножество [2] (кодовая точка *
), вы возвращаетесь на первый уровень и должны сгенерировать подмножество [1]. Но subset
объект уже содержит элемент 2, поэтому генерация [1] невозможна без удаления элемента 2 в *
Если реализация создает новую копию аргумента, вам не нужно восстанавливать состояние.
Комментарии:
1. Извините, не понял, я имею в виду, что изначально подмножество = [] , когда я вызываю search в первый раз, я разделяю [ ] , затем подмножество = [ A[0]], и я использую этот экземпляр, он же [A[0]], почему мне нужно удалить [0] и снова создать подмножество = [ ]? После этого я не выполняю никакого вызова функции, где я могу поделиться этим экземпляром?
2.
ArrayList<Integer> subset
аргумент на самом деле является адресом объекта. Существует только одна копия объекта (если вы не делаете глубокую копию). Когда вы изменяете объект на более глубоком уровне рекурсии, изменения будут видны и на более высоких уровнях. Я добавил пример.3. @Little_idiot Вы знаете о пометке ответов как решения?