一尘不染

高效存储功率设定算法

algorithm

尝试计算9个字母的字符串“ ABCDEFGHI”的所有子集(幂集)。

使用标准的递归方法,我的机器在完成之前会出现内存不足(1GB)错误。我没有更多的物理内存。

如何更好地做到这一点?语言没有问题,发送到标准输出的结果也很好-输出之前不需要将其全部保存在内存中。


阅读 228

收藏
2020-07-28

共1个答案

一尘不染

从X = {A,B,C,D,E,F,G,H,I}的幂集到0到2 ^ | X |之间的数字集存在一个平凡的双射映射。= 2 ^ 9:

Ø映射到000000000(以2为基)

{A}映射到100000000(以2为基)

{B}映射到010000000(以2为基)

{C}映射到001000000(以2为基)

{I}映射到000000001(以2为基)

{A,B}映射到110000000(以2为底)

{A,C}映射到101000000(以2为基)

{A,B,C,D,E,F,G,H,I}映射到111111111(以2为底)

您可以使用此观察来创建如下的幂集(伪代码):

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
}

这样,您可以避免任何递归操作(并且,根据所需的电源集,您甚至可以“生成”电源集而无需分配许多数据结构-例如,如果您只需要打印电源集) 。

2020-07-28