【问题标题】:select on a bit vector in C++ complexity and implementation在 C++ 复杂性和实现中选择位向量
【发布时间】:2016-06-27 10:54:51
【问题描述】:

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

问题概览:

  • 位向量 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 中的更改(对吗??我还没有找到任何非常具体的内容),这意味着它需要在修改后的每一步都进行初始化。

我读过的论文是: “位图上的快速、小型、简单排序/选择”(G. Navarro 和 E. Providel)和“实用熵压缩排序/选择字典”(D. Okanohara K.Sadakane),我将不胜感激任何与 C++ 中可靠实现的链接(如果结构满足我的要求)

我在 stackexchange 上找到的关于类似主题但没有帮助的内容:

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

提前致谢。

【问题讨论】:

  • 我不知道有一个库可以做到这一点,但您可以轻松实现它。您可以在 O(1) 中分别使用 b = b & ~(1 << i)b = b | (1 << i) 将 b[i] 设置为 0 或 1。除此之外,您可以使用b = b ^ (1 << i) 更改位(如果为 0,则将其设置为 1,如果为 1,则将其设置为 0)并检查您可以使用 (b & (1 << i)) > 0 的位,如果 i 位为 1,则返回true,否则返回 false。
  • “在每一步快速获取索引集 I(绝对不超过 O(logN),理想情况下为 O(1))”——然后你打算用它做什么?根据您的说法,它至少有 10% 的时间会包含一些与 N 成正比的索引,因此您步行所需的时间与 N 成正比。
  • 我想到了一些数据结构,它“跟踪”变化并允许以比遍历 N 个站点更快的方式检索索引,可能是一些树实现或任何其他过度结构承认检索此类信息!但这意味着插入/删除的复杂性更高,对吗?我可以承认 for 循环中某些东西的成本为 O(log N),但绝对不是 O(N)……但我不确定这是否可能!我读的越多,我就越困惑……顺便说一句,感谢您的阅读和回答;)
  • 如果按顺序检索索引的成本对您来说比设置/清除成本更重要,那么您正在寻找某种优先级队列/堆。这些理论上可以为大多数操作平均恒定时间(通常删除变为 log(N),其他一切都是恒定的),但实现通常很复杂,并且恒定开销往往相当高。 Brodal、Fibonacci 等堆的生产实现比我在下面链接到的稀疏集合更多地存在:)

标签: c++ select time-complexity bitvector


【解决方案1】:

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

具体来说:

  • 初始化是常数时间
  • 设置/清除条目是固定时间
  • 成员资格测试是固定时间
  • 检索条目集的条目数为 O(N)(假设您不需要对它们进行排序 - 实际上您最终会按插入顺序遍历它们;您不会比 O( N)总体而言,如果您需要为接下来发生的任何事情走所有这些路,当然)

【讨论】:

  • 这非常好,也许我可以从中得到一些有用的东西:) 谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
相关资源
最近更新 更多