Алгоритм нахождения набора мощности {1,2,3}

Я думаю, что это немного сбивает меня с толку, потому что я никогда особо не использовал Java-наборы. Не мог бы кто-нибудь попытаться показать мне (желательно, объяснив, как постепенно создается powerset) в следующем коде (ps я получил этот код из сообщения в stackoverflow, поэтому честь принадлежит этому человеку):

public static void main(String[] args) {
        Set<Integer> mySet = new HashSet<Integer>();
        mySet.add(1);
        mySet.add(2);
        mySet.add(3);
        for (Set<Integer> s : powerSet(mySet)) {
            System.out.println(s);
        }

    }

    public static <T> Set<Set<T>> powerSet(Set<T> originalSet) {
        Set<Set<T>> sets = new HashSet<Set<T>>();

        //If the input is empty, add the empty set and return
        if (originalSet.isEmpty()) {
            sets.add(new HashSet<T>());
            return sets;
        }

        //Put the originalSet into an arraylist
        List<T> list = new ArrayList<T>(originalSet);

        //Get the first element
        T head = list.get(0);

        //Get everything but the first element and put into a set
        Set<T> rest = new HashSet<T>(list.subList(1, list.size()));

        //For each element in the set above
        for (Set<T> set : powerSet(rest)) {

            //Create a new set
            Set<T> newSet = new HashSet<T>();

            //Add the head
            newSet.add(head);

            //Add the rest
            newSet.addAll(set);

            //Add all of newset to the result
            sets.add(newSet);

            //Add the current element
            sets.add(set);
        }
        return sets;
    }

person James T    schedule 30.08.2011    source источник
comment
Кредит не переходит никому, если вы не сообщите нам, кому он принадлежит. Это то, что означает: мы, читатели, узнаем, кто выполнил эту работу.   -  person hmakholm left over Monica    schedule 30.08.2011
comment
Что касается вопроса: насколько вам комфортно с рекурсией? Другими словами, вопрос заключается в понимании рекурсивного алгоритма или в возможности прочитать конкретные детали реализации Java?   -  person hmakholm left over Monica    schedule 30.08.2011
comment
Вы имели в виду это? stackoverflow.com/questions/1670862 /. Если да, включите эту ссылку в свой вопрос.   -  person Kal    schedule 30.08.2011
comment
Мне кажется, это хорошо прокомментировано. Какая часть (и) сбивает с толку?   -  person Bart Kiers    schedule 30.08.2011
comment
Я комментировал, просто не вижу, как это получается в powerset. Если наш исходный набор был {1,2,3}, когда мы находимся «на 1», как нам пропустить «2», чтобы взять «3» и создать, например, набор {1,3}?   -  person James T    schedule 30.08.2011
comment
Комментарий for each element in the set above должен быть for each subset of the rest set. Если 1 является первым элементом, то рекурсивный вызов генерирует набор мощности {2,3}, то есть наборы {2,3}, {2}, {3}, {}. Затем цикл принимает каждый из них, излучает его либо с 1, либо без него.   -  person hmakholm left over Monica    schedule 30.08.2011


Ответы (1)


Подумайте о powerset {1, 2, 3}. Мы можем думать об этом как о комбинации:

{}  
{1} + powerset {2, 3}  
{2} + powerset {3}  
{3} + powerset {}

Взяв строку {1} + powerset {2, 3}, это расширяется до:

{1} + { {}, {2}, {3}, {2, 3} }

что, в свою очередь, становится:

{ {1}, {1, 2}, {1, 3}, {1, 2, 3} }

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

person rossum    schedule 30.08.2011
comment
@Burleigh Bear Что насчет этого? Дальнейшее расширение {2, 3} просто приводит к дублированию {1}, {1, 2} и {1, 3} - person rossum; 31.08.2011
comment
Хм, кажется, я не совсем понял ваше объяснение. Я думал, что вы пытаетесь показать работу для Pow ({1, 2, 3}). Но ваша работа на самом деле никогда не дает ответа? - person Burleigh Bear; 31.08.2011
comment
@Burleigh Bear: Я не показываю полного ответа. Я просто объяснил работу на верхнем уровне и опустил одну часть верхнего уровня на второй уровень. {2, 3} - это один из результатов {2} + powerset {3}, который я не раскрывал. - person rossum; 31.08.2011