有效地找到第 k 个集合位在位集中的位置

Posted

技术标签:

【中文标题】有效地找到第 k 个集合位在位集中的位置【英文标题】:Efficiently finding the position of the k'th set bit in a bitset 【发布时间】:2015-02-12 19:19:12 【问题描述】:

我有一个稀疏的位集,可能有数百万甚至数十亿位宽。假设 bitset 已经被有效压缩,并假设我也可以有效地查询 bitset 以查看在某个给定范围(即位置和长度)中设置了多少位。

鉴于此,我能否有效地找到第 k 个设置位在位集中的位置,或者有效地给出它不存在的指示?对编程语言中立的算法的描述将是理想的。假设我无法更改 bitset 实现的任何内部结构......也就是说,我可以对 bitset 做的唯一事情是查询它的总宽度,并询问它在任何给定范围内设置了多少位。

【问题讨论】:

在检查设置了多少位时,是否有关于范围可以有多大的规定?如果您告诉我们该操作的时间复杂度可能会有所帮助。 您的描述建议修改二进制搜索:递归二分法缩小了第 k 位存在的间隔。您需要将当前测试间隔“左”设置的位数作为附加参数(您从以前的递归级别知道此数字)。 【参考方案1】:

如果可以高效查询每个范围内设置的位数,可以对#set_bits(0,i)进行二分查找,找到该值等于k的第一个索引。

它将采用O(log(n)*f(n)),其中f(n)#set_bits(0,i) op 的复杂度。

【讨论】:

谢谢...我认为这很简单,但由于某种原因,我对实际需要做的事情一无所知。 哈哈哈,我在设计我的解决方案时想得太复杂了:-)。你的路要走!

以上是关于有效地找到第 k 个集合位在位集中的位置的主要内容,如果未能解决你的问题,请参考以下文章

在位范围内查找第一个设置位的位置

如何并行计算 k 个集合位的所有组合?

215. 数组中的第K个最大元素(TOP-K问题)

如何在两个排序数组的并集中找到第 k 个最小的元素?

在位集中,我可以将“to_ulong”用于特定范围的位吗?

使用 mongodb / mongoose 有条件地将 5-20k 文档的输入批次处理成一个包含多达一百万个文档的集合的有效方法是啥?