Hay una biyectiva de representación trivial desde el conjunto potencia de X = {A, B, C, D, E, F, G, H, I} al conjunto de números entre 0 y 2^| X | = 2^9:
mapas Ø a 000000000 (base 2)
{A} se asigna a 100000000 (base 2)
{B} se asigna a 010000000 (base 2)
{ C} se asigna al 001 000 000 (base 2)
...
{I} se asigna a 000000001 (base 2)
{A, B} se asigna al 110000000 (base 2)
{A, C} se asigna al 101 000 000 (base 2)
...
{A, B, C, D, E , F, G, H, I} se asigna al 111111111 (base 2)
puede utilizar esta observación para crear el poder establecer así (pseudo-código):
Set powerset = new Set();
for(int i between 0 and 2^9)
{
Set subset = new Set();
for each enabled bit in i add the corresponding letter to subset
add subset to powerset
}
de esta manera se evita cualquier recursión (y, dependiendo de lo que necesite el poder establecido, incluso puede ser capaz de "generar" el conjunto de potencias sin asignar muchas estructuras de datos; por ejemplo, si solo necesita imprimir el conjunto de energía).
http://rosettacode.org/wiki/Power_set#Non-recursive_version – tur1ng
@ tur1ng Ah, eso es genial. Intentaré compilar y ver qué pasa. – zaf
¿Estás seguro de que no has cometido un error en tu algoritmo? ¿Funciona para entradas más pequeñas? La razón por la que pregunto es que hay 2^9 = 512 subconjuntos de 'ABCDEFGHI' y obtener 1GB de memoria utilizada significa que * debe * estar haciendo algo mal ... –