Có một ánh xạ song ánh tầm thường từ bộ sức mạnh của X = {A, B, C, D, E, F, G, H, I} đến tập hợp các số từ 0 đến 2^| X | = 2^9:
bản đồ Ø tới 000000000 (cơ sở 2)
{A} bản đồ để 100000000 (cơ sở 2)
{B} bản đồ để 010.000.000 (cơ sở 2)
{ C} bản đồ để 001000000 (cơ sở 2)
...
{I} bản đồ để 000.000.001 (cơ sở 2)
{A, B} bản đồ để 110.000.000 (cơ sở 2)
{A, C} bản đồ để 101.000.000 (cơ sở 2)
...
{A, B, C, D, E , F, G, H, I} bản đồ để 111111111 (cơ sở 2)
bạn có thể sử dụng quan sát này để tạo sức mạnh thiết lập như thế này (pseudo-code):
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
}
Bằng cách này bạn tránh bất kỳ đệ quy nào (và tùy thuộc vào những gì bạn cần thiết lập cho, bạn thậm chí có thể "tạo ra" các quyền hạn mà không cần phân bổ nhiều cấu trúc dữ liệu - ví dụ, nếu bạn chỉ cần in ra bộ điện).
http://rosettacode.org/wiki/Power_set#Non-recursive_version – tur1ng
@ tur1ng Ah, đó là mát mẻ. Tôi sẽ thử biên dịch và xem điều gì xảy ra. – zaf
Bạn có chắc là bạn không có lỗi trong thuật toán của mình không? Nó có hoạt động với các đầu vào nhỏ hơn không? Lý do tôi hỏi là có 2^9 = 512 tập hợp con 'ABCDEFGHI' và nhận được 1GB bộ nhớ được sử dụng có nghĩa là bạn * phải * đang làm sai điều gì đó ... –