【发布时间】:2011-08-23 09:43:59
【问题描述】:
我们有一组 S 键。
对于成员查询(k 在 S 中吗?),布隆过滤器通常可以帮助我们快速确定某个键不在集合中。
我们如何过滤范围查询(S 中是否有来自范围 [k1,k2] 的键?)?
【问题讨论】:
标签: algorithm search data-structures dictionary bloom-filter
我们有一组 S 键。
对于成员查询(k 在 S 中吗?),布隆过滤器通常可以帮助我们快速确定某个键不在集合中。
我们如何过滤范围查询(S 中是否有来自范围 [k1,k2] 的键?)?
【问题讨论】:
标签: algorithm search data-structures dictionary bloom-filter
您可以使用分段树或 Fenwick 树在 O(log n) 时间内解决此问题。
对于分段树,您可以提出以下问题:[a..b] 范围内是否有位集?这个问题可以在 O(log n) 时间内得到回答。此外,您可以在 O(log n) 时间内设置(或取消设置)单个位。
与芬威克树类似。
假设:键 k1、k2 等...是整数 - 我们必须做出这个假设,这样我们才能理解范围 [k1..k2]。
【讨论】:
您是否可以控制要测试的范围的长度?如果范围很小(k2 - k1
【讨论】:
通过确保其中一个哈希的低位字节/位完整地通过哈希函数,您可以更快地测试多个值。
例如你有散列函数 f(x) 和散列函数 g(x)。你定义 f(x) 使得 f(x) = hash_function(x div 16) + x mod 16。
搜索时,您可以在 f(x) 结果周围的 2 个字节(16 位)中搜索 1 位。如果找到了,请测试相应的命中值。
这意味着您可以一次搜索匹配的 16 个值,并且可以快速检索两个字节。
请注意,以这种方式使用哈希函数可能会以其他方式影响您的结果。
【讨论】: