选择C ++复杂性和实现中的位向量

时间:2016-06-27 10:54:52

标签: c++ select time-complexity bitvector

我正在实施矩阵缩减算法,我是一名数学学生。 显然我已经在互联网上搜索和阅读,但没有找到我正在寻找的内容(我最后列出了我发现的内容以及我读过的论文。)< / p>

问题的快速概述:

  • 位向量b的FIXED LENGTH N。

  • b每一步都会发生变化(可能只有几个指数(大部分时间)或指数相当多(从1/10到1/3),这只有约10%例)。

  • 我已经有了稀疏实现,现在我想使用bitvector的一些智能实现来编写代码。

    //initialize to 0 
    b=bitvector(0, n=N)
    
    for i in 1 to N
        {some operations on the bitvector b}
        get I= { j | b[j] == 1 }
        {save I}
    

我需要的是:

  • 快速设置b [i] = 1或= 0(可能为O(1))
  • 在每一步快速获取索引集I(绝对不超过O(logN),理想情况下为O(1))
  • 允许它的C ++库
  • 文件/文件

有什么好处:

  • 快速获得最低的&#34;#34; (最后一个索引设置为1,即select(rank(b)),如果两个操作都很快(O(1)))

我不需要的是:

  • 节省空间
  • 压缩数据

我一直在使用Simon Gog等人的Sdsl 2.0库。 (https://github.com/simongog/sdsl-lite)但是选择结构

bit_vector::select_1_type

要初始化O(n),每个查询都需要O(1),但不会&#34;跟随&#34; b的变化(对吗?我还没有发现任何非常具体的内容),这意味着它需要在修改后的每一步都进行初始化。

我读过的论文是: &#34;在位图上快速,小巧,简单的排名/选择&#34; (G. Navarro和E. Providel)和&#34;实用熵 - 压缩等级/选择词典&#34; (D. Okanohara K. Sadakane)我将非常感谢C ++中可靠实现的任何链接(如果结构符合我的要求)

我在stackexchange上发现的关于类似主题的内容并没有帮助:

对于这个冗长的问题,我很抱歉,我希望我解释了我需要什么以及我找到它的决心。我仍然对与bitvectors相关的各种事情感到困惑,它绝对不是我的专业领域,所以任何澄清都是值得赞赏的。

提前致谢。

1 个答案:

答案 0 :(得分:1)

所描述的结构here是我所知道的最接近你想要的属性。

具体做法是:

  • 初始化是恒定时间
  • 设置/清除条目是恒定时间
  • 测试会员资格是不变的时间
  • 检索条目集的条目数是O(N)(假设你不需要它们排序 - 你实际上最终按照插入的顺序走它们;你不会做得比O好( N)总的来说,如果你需要为接下来发生的任何事情行走所有这些,当然)