【发布时间】: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