我有一个稀疏的位集,可能有数百万甚至数十亿位宽。假设bitset已经被有效压缩,并且假设我也可以有效地查询bitset,以确切地查看在某个给定范围(即位置和长度)中设置了多少位。
鉴于此,我是否可以有效地找到位集中第k个设置位的位置,或者有效地指示它不存在?编程语言中立的算法的描述将是理想的。假设我无法更改bitset实现的任何内部结构...也就是说,我对bitset执行的唯一操作就是查询其总宽度,并询问它在任何给定范围内设置了多少位。 / p>
答案 0 :(得分:3)
如果您可以有效地查询每个范围中设置的位数,您可以在#set_bits(0,i)
上执行二进制搜索,以找到该值等于k
的第一个索引。
需要O(log(n)*f(n))
,其中f(n)
是#set_bits(0,i)
操作的复杂性。