2015-10-07 2 views
2

В java У меня есть набор, где я хочу получить все возможные комбинации подмножеств, которые их объединение делает основной набор. (Разбиение набора) , например: множество = {1,2,3}получить все возможные разделы набора

результат должен быть:

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

код до сих пор:

public static <T> Set<Set<T>> powerSet(Set<T> myset) { 
     Set<Set<T>> pset = new HashSet<Set<T>>(); 
     if (myset.isEmpty()) { 
      pset.add(new HashSet<T>()); 
      return pset; 
     } 
     List<T> list = new ArrayList<T>(myset); 
     T head = list.get(0); 
     Set<T> rest = new HashSet<T>(list.subList(1, list.size())); 
     for (Set<T> set : powerSet(rest)) { 
      Set<T> newSet = new HashSet<T>(); 
      newSet.add(head); 
      newSet.addAll(set); 
      pset.add(newSet); 
      pset.add(set); 
     } 

     return pset; 
    } 

, который выводит Powerset от массива:

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]] 
+2

Каков код, который вы уже создали? –

+0

Я могу извлечь набор команд set, а также разделы только двух наборов, например, просто {{1,2}, {3}} и {{1,3}, {2}} –

+0

Хорошо, отредактируйте свой пост и дайте us исходный код –

ответ

2

Самое простое решение - использование рекурсии о количестве элементов вашего набора: Создайте функцию, которая строит все разделы набора n-элементов. Для n + 1 элементов вы либо добавляете новый элемент к существующим наборам разделов, либо помещаете его в свой собственный набор.

+0

не могли бы вы объяснить больше? –

+1

Вы создаете функцию, которая принимает число n элементов основного набора в качестве аргумента. Если n = 0, эта функция просто возвращает пустое множество. В противном случае он вызывает себя аргументом n-1 и использует результат, как объяснялось выше, для вычисления ответа для n. Извините, я не могу дать вам фрагменты кода, поскольку я не программист на Java. Но этот рекурсивный подход - это общий шаблон, который также работает на Java. – MightyCurious

Смежные вопросы