让我们举一些序列A,例如{-1, 3, 2, 5}
。我们可以使用迭代选择所有非空子序列(二进制递增一些迭代器)1 .. 2^|A|
:
int i, A[] = {-1, 3, 2, 5};
for (i = 1; i < (1 << sizeof(A)); i++)
{
int t = i, p = 0;
while (t > 0)
{
if (t % 2 > 0)
printf("%d\t", a[p]);
t /= 2, p++;
}
printf("\n");
}
但是如果A包含例如5000000个元素,我们应该怎么做?例如。如何处理50亿位数?
答案 0 :(得分:1)
有一组不合理的算法可以执行称为“枚举算法”的任务。他们主要处理以下问题: 1.所有子集的第i个非空子集是什么? 2.给定非空子集,下一个元素是什么?或以前 3.给定非空子集,该子集的等级是多少?
所有这些操作均以线性时间执行。如果您想获得所有子集,则需要进行回溯。
一本处理这些问题的有趣书籍是:组合算法,生成,枚举,搜索由K. Rossen撰写。 我还有关于这个主题的一组幻灯片,我不知道如何附加它们。检查Lucia Moura网站,课程组合算法。
(如果您需要上述任何算法的详细信息,请告诉我们)
答案 1 :(得分:0)
您可能希望使用CUDA或SSE开始优化它,就像bitmagic一样。
你还可以测试字节是否完全为零并完全跳过它们,并且使用BSR,BSF和LCZ,你可以跳过零位,只打印出零跳过的位数。