3

我正在实现一个矩阵缩减算法,我是一名数学学生。显然我已经在互联网上搜索和阅读,但没有找到我正在寻找的东西(我在最后列出了我找到的内容和我读过的文件。)

问题的快速概述:

  • 位向量 b 具有 FIXED LENGTH N。

  • b 每一步都发生变化(可能仅在几个索引处(大多数时候)或在相当多的索引处(从 1/10 到 1/3),这仅在约 10% 的情况下)。

  • 我已经有一个稀疏实现,现在我想使用位向量的一些智能实现对其进行编码。

    //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++ 库
  • 文件/文件

有什么会很高兴:

  • 一种快速获取“最低”的方法(最后一个索引设置为 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),但不“遵循” b 中的更改(对吗??我还没有找到任何非常具体的内容),这意味着它需要在修改后的每一步。

我读过的论文是:“Fast, Small, Simple Rank/Select on Bitmaps”(G. Navarro 和 E. Providel)和“Practical Entropy-Compressed Rank/Select Dictionary”(D. Okanohara K. Sadakane)和 I将不胜感激任何与 C++ 中可靠实现的链接(如果结构满足我的要求)

我在 stackexchange 上找到的关于类似主题的东西没有帮助:

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

提前致谢。

4

1 回答 1

1

这里描述的结构是我所知道的最接近您想要的属性的东西。

具体来说:

  • 初始化是常数时间
  • 设置/清除条目是恒定的时间
  • 成员资格测试是固定时间
  • 检索条目集的条目数为 O(N)(假设您不需要对它们进行排序 - 实际上您最终会按插入顺序遍历它们;总体而言,您不会比 O(N) 做得更好当然,如果您需要为接下来发生的一切走动他们所有人)
于 2016-06-27T12:32:26.023 回答