如何处理很长的序列?

时间:2011-05-27 15:49:43

标签: c algorithm binary sequence subset

让我们举一些序列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亿位数?

2 个答案:

答案 0 :(得分:1)

有一组不合理的算法可以执行称为“枚举算法”的任务。他们主要处理以下问题: 1.所有子集的第i个非空子集是什么? 2.给定非空子集,下一个元素是什么?或以前 3.给定非空子集,该子集的等级是多少?

所有这些操作均以线性时间执行。如果您想获得所有子集,则需要进行回溯。

一本处理这些问题的有趣书籍是:组合算法,生成,枚举,搜索由K. Rossen撰写。 我还有关于这个主题的一组幻灯片,我不知道如何附加它们。检查Lucia Moura网站,课程组合算法。

(如果您需要上述任何算法的详细信息,请告诉我们)

答案 1 :(得分:0)

您可能希望使用CUDA或SSE开始优化它,就像bitmagic一样。

你还可以测试字节是否完全为零并完全跳过它们,并且使用BSR,BSF和LCZ,你可以跳过零位,只打印出零跳过的位数。