【问题标题】:Filter for range queries on a set过滤集合上的范围查询
【发布时间】:2011-08-23 09:43:59
【问题描述】:

我们有一组 S 键。

对于成员查询(k 在 S 中吗?),布隆过滤器通常可以帮助我们快速确定某个键不在集合中。

我们如何过滤范围查询(S 中是否有来自范围 [k1,k2] 的键?)?

【问题讨论】:

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


    【解决方案1】:

    您可以使用分段树或 Fenwick 树在 O(log n) 时间内解决此问题。

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

    与芬威克树类似。

    假设:键 k1、k2 等...是整数 - 我们必须做出这个假设,这样我们才能理解范围 [k1..k2]。

    【讨论】:

    • B-trees,或任何其他搜索树,也可以让你在 O(log n) 内回答范围查询。
    • @IritKatriel 是的,但它们主要用于磁盘上。当用户提到“过滤器”时,我认为它主要用于内存过滤,其中误报是可以的(如布隆过滤器)。此外,对于“过滤器”数据结构,内存使用很重要——Fenwick 树的内存占用量很低,而 B-Tree 的内存占用量要大得多——因为节点中的空间被浪费了。
    • @IritKatriel 同样,如果您知道范围在静态范围内,您还可以使用 vEB 树 - 每个字典操作的成本为 O(lg lg n)。
    【解决方案2】:

    您是否可以控制要测试的范围的长度?如果范围很小(k2 - k1

    【讨论】:

    • 没错,但我对范围没有小范围。
    • 如果您知道值的分布(线性、对数等),那么您可以压缩您的范围并使用 Fenwick Trees 进行近似集成员资格测试。这会稍微减少您的搜索空间。
    【解决方案3】:

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

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

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

    这意味着您可以一次搜索匹配的 16 个值,并且可以快速检索两个字节。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多