如何处理很长的位序列?

| 让我们有一些序列A,例如
{-1, 3, 2, 5}
。我们可以使用迭代(二进制增加迭代器))1ѭ来选择其所有非空子序列:
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亿位数?     
已邀请:
        嗯,有一组执行这些任务的惯用算法,称为“枚举算法”。他们主要处理哪些问题,例如: 1.所有子集中的第i个非空子集是什么? 2.给定一个非空子集,下一个元素是什么?或更早 3.给定一个非空子集,该子集的等级是多少? 所有这些操作都以线性时间执行。如果要获取所有子集,则需要进行回溯。 涉及这些问题的一本有趣的书是:组合算法,生成,枚举,搜索作者:K。Rossen。 我也有关于此主题的一组幻灯片,但是我不知道如何附加它们。请访问Lucia Moura网站,课程“组合算法”。 (如果您需要以上任何一种算法的详细信息,请告诉我)     
        您可能想要像bitmagic一样使用CUDA或SSE开始对其进行优化。 您还可以测试字节是否完全为零并完全跳过它们,并且使用BSR,BSF和LCZ,您可以跳过零位,并仅输出零以了解跳过的位数。     

要回复问题请先登录注册