Aew galera, tô desenvolvendo uma classe Conjunto em Java e preciso de um metodo que realize a operacao de conjunto das partes de um conjunto( esta operação retorna o conjunto de todos os subconjuntos do conjunto original ). Ja tentei fazer iterativo e recursivo mas não tive sucesso. Se alguem souber como se implementa Conjunto Das Partes de um conjunto ou souber de algum site que tem um pseudo-codigo, ideia, ou implementação, eu agradeceria muito pela ajuda.
Para o seu caso veja o método public boolean retainAll(Collection c) de AbstractCollection.
[]s
Luca[/quote]
Oi, creio que este metodo, retainAll( Collection c ) não serve para o meu caso, este metodo eu usei para fazer interseção de conjuntos( eh muito adequado ), mas eu tô interessado mesmo eh no algoritmo, a ideia de como achar todos os subconjuntos de um conjunto.
//Retorna todos subconjuntos de cardinalidade n - 1
Collection subconjuntosM1(Set conjunto) {
Collection res = new ArrayList();
for(int i = 0; i < conjunto.size(); ++i)
res.add(conjunto.clone());
for(Iterator i = conjunto.iterator(), j = res.iterator(); i.hasNext(); ) {
((Collection)j.next()).remove(i.next());
}
return res;
}
Collection todosSubConjuntos(Set conjunto) {
if(conjunto.size() == 1)
return Collections.singletonSet(conjunto);
Collection res = new ArrayList();
Collection sub = subconjuntosM1(conjunto);
for(Iterator i = sub.iterator(); i.hasNext(); )
res.putAll(todosSubConjuntos((Set)i.next());
return res;
}
Não testei, mas deve te dar 1 boa idéia de como fazer.
Dado o conjunto N de cardinalidade n gere todos os n subconjuntos de cardinalidade n-1. Só repetir esse processo recursivamente e para quando encontrar conjuntos unitarios.
Para gerar os n subconjuntos: crie n copias de N, então remova de cada copia um elemento distinto de N.
eu tive o seguinte problema na faculdade semestre passado:
o seu problema seria mais ou menos isso? se for, eu publiquei uma “quase-solucao” do problema no meu site… a solucao do problema dá todos os subconjuntos, o problema é q nao está em ordem lexicografica (se vc descobrir como fazer isso me fale - sem passar por um algoritmo de ordenacao, logico!)
[quote=“Paulo Silveira”]sergio, sua versao esta array oriented :)…
entao, o nome disso ai eh POWERSET, o do louds e do sergio tao certinhos[/quote]
sim… e o codigo ta zuado tbm (nem um pouco Java…heheheh)
mas, como o jmaster tava procurando um algoritmo, talvez a ideia do algoritmo ajude… ele mostra como pode usar recursao para resolver o problema
Valew galera, eu estava agora estudando um algoritmo que resolve o problema, mas ele eh iterativo e seu codigo ( em C ) está muito obscuro. Estes em java são bem mais simples para assimilar a ideia.