2013-02-11 3 views
0

Я ищу некоторую помощь с моим назначением программирования Java. Используя связанный список, мне нужно распечатать его набор мощности. Например, набор {1,2,3} должен распечатывать {{}, {1} {1,2} {1,3} {1,2,3} {2} {2,3} {3 }}. Число элементов в множестве мощности равно 2^n. Это нужно сделать, позвонив по телефону HeadNode.PrintPowerSet();
где HeadNode - это первый элемент в связанном списке. Я пробовал несколько вещей, и ничего не работает так хорошо. Я думаю, что лучший способ сделать это - вызывать метод рекурсивно до тех пор, пока не будет достигнут конечный дозор, а затем работать назад, добавив оставшиеся элементы. Извините, я не могу опубликовать больше кода или больше идей, потому что ничего, что я пробовал, так хорошо работает. Заранее спасибо.Поиск набора параметров из связанного списка

EDIT: Это нерабочий код. Она возвращает множество {{1,2,3} {2,3} {3}}

public RSet powerSet() 
{ 
    if (this == EMPTY_SET) 
     return EMPTY_SET; 

    RSet q = new RSet(); 
    if (q != EMPTY_SET) 
     q.next = next.powerSet(); 
    q = new RSet(this, n, q.next); 

    return q; 
} 

EMPTY_SET конец сторожевого. Я пробовал написать его вручную. Это помогает, но я до сих пор не могу это получить. Также этот класс, RSet, по существу является только связанным узлом списка.

+3

Опубликуйте свой нерабочий код. –

+0

[Этот ответ] (http://stackoverflow.com/a/1670871/828193) делает это с помощью 'Set'. Я думаю, вы могли бы легко адаптировать его, чтобы использовать ссылку «LinkedList» – user000001

+0

. Подсказка: вставьте пустой элемент внутри списка, так что вы будете иметь элементы «n + 1». Затем сделайте рекурсивную функцию, которая перебирает все элементы в списке (включая пустую), и находит все три возможности комбинации. Например: {Empty, Empty, 1} будет {1} .. – Shivam

ответ

0

Просто перебирать все числа от 0 до 2^п - 1. Каждый определяет элемент силового набора:

Список определяет фиксированный индекс на телевизоре. Для каждого номера создайте новый набор. Рассматривая число в двоичном формате, добавьте элемент в исходный набор в индекс i к набору, если бит в индексе i равен 1 и не добавляет его в противном случае.

Затем для каждого номера у вас будет набор, являющийся элементом набора мощности.

int n = list.size(); 

Set<Set<T>> powerSet = new HashSet<Set<T>>(); 

for(long i = 0; i < (1 << n - 1); i++) { 
    Set<T> element = new HashSet<T>(); 
    for(int j = 0; j < n; j++) 
     if((i >> j) % 2 == 1) element.add(list.get(j)); 
    powerSet.add(element); 
} 

return powerSet; 
+0

Этот набор может содержать строки или любое случайное число. Я просто привел простой пример. – Jeff

+0

Да, алгоритм, который я описал, будет работать для любого типа объекта. –

+0

Я действительно ценю это, но для этого задания нам не разрешено использовать Set или HashSet. Это нужно делать с этим классом и рекурсивно. – Jeff