过滤集合上的范围查询

时间:2011-08-23 09:44:00

标签: algorithm search data-structures dictionary bloom-filter

我们有一套钥匙。

对于成员资格查询(S中是k?),布隆过滤器通常可以帮助我们快速确定密钥不在集合中。

我们如何过滤范围查询(是否存在S中范围[k1,k2]的关键字?)?

3 个答案:

答案 0 :(得分:1)

您可以使用Segment Trees或Fenwick Trees在时间O(log n)中解决此问题。

对于分段树,您可以问问题是[a..b]范围内有位设置吗?这个问题可以及时回答O(log n)。此外,您可以在时间O(log n)中设置(或取消设置)单个位。

与Fenwick Trees类似。

假设:密钥k1,k2等是整数 - 我们必须做出这个假设,以便我们能够理解范围[k1..k2]。

答案 1 :(得分:0)

您是否可以控制要测试的范围的长度?如果范围很小(k2 - k1 <某些小数字),那么您可以使用之前的布隆过滤器并检查范围内的每个k。

答案 2 :(得分:0)

您可以通过确保其中一个哈希值的低位字节/位完整地通过哈希函数来更快地测试多个值。

E.g。你有散列函数f(x)和散列函数g(x)。你定义f(x)使得f(x)= hash_function(x div 16)+ x mod 16。

搜索时,可以搜索f(x)结果周围的2个字节(16位)1位。如果找到一个,请测试匹配的相应值。

这意味着您可以使用快速的双字节检索一次搜索匹配16个值。

请注意,以这种方式使用哈希函数可能会以其他方式影响您的结果。