具有 O(1) 查找速度的区间搜索算法

Posted

技术标签:

【中文标题】具有 O(1) 查找速度的区间搜索算法【英文标题】:Interval search algorithm with O(1) lookup speed 【发布时间】:2015-05-07 19:30:40 【问题描述】:

我需要设计一个适用于 64 位密钥的区间搜索算法。匹配是当密钥 k 在 k1 和 k2 之间时。一个重要的要求是查找速度要优于 O(log n)。研究现有文献并没有比区间搜索树更好。我想知道这是否可行。

【问题讨论】:

不可能。您甚至无法在 O(1) 中执行精确搜索(您的算法显然会作为特殊情况实现)-您可能正在考虑哈希表,但 O(1) 查找仅意味着哈希函数为 O(1),不是查找的整体摊销复杂度(请记住,如果不重新散列,它们将降级到 O(n),这本身就是 O(n),等等) 没有 O(1),您可能会发现这很有趣,可以找到满足您特定要求的最佳数据结构 ***.com/questions/17466218/… @OutputLogic - 你能举一个简单的输入和期望输出的例子吗? 当然可以,如果您不再将其视为一组范围,而是将其视为一组巨大的布尔值。例如特里。如果您有 64 位密钥,则 O(keysize) 是常数时间。 (不过,64 比任何合理范围数量的日志都多) @hatchet :这是一个众所周知的通信协议。输入是 64 位地址。间隔是地址的范围。每个范围都与一个 32 位命令相关联。传入的数据包包含一个地址。如果它在范围内,则输出与数据包关联的命令。 【参考方案1】:

如果您的密钥有分布,接近统一,您可以使用 Interpolation search,有 O(log log N) 时间 - 这比 O(log n) 要好得多。

UPD:只是一个想法: 如果你有足够的额外内存,你可以构建类似 trie 的结构。将有 O(1) 搜索时间。想法如下:例如,让我们设置数组树[256],其中每个数组由某个字节的键索引。连接到 trie 的数组。所以,trie 的根元素 - 是 array[265],其中 index 是键的高字节。但无论如何这是不切实际的,因为在底部节点中,对于搜索边界,需要执行大约 64 次迭代的线性搜索。

【讨论】:

不幸的是我不能假设任何分布。【参考方案2】:

您可以按前导字节进行调度,直到问题变小。这避免了区间树的大部分开销,同时保持了区间树的灵活性。

因此,您有一个包含 256 个结构的表,该表根据需要向下指向 256 个结构,直到您遇到“不匹配”标志,或者您被指向一个小区间树以获得精确匹配条件。使用直接跳转而不是遍历多重比较、可能的管道停顿等来处理此树的顶部可能对您来说是一个显着的性能改进。

【讨论】:

以上是关于具有 O(1) 查找速度的区间搜索算法的主要内容,如果未能解决你的问题,请参考以下文章

常见搜索算法:二分查找

查找算法之顺序二分二叉搜索树红黑树 详细比较总结

二分查找典型例题分析

二分搜索 O(log n) 算法在顺序列表中查找重复项?

二分查找(通过相对位置判断区间位置)--17--二分--LeetCode33搜索旋转排序数组

复盘笔记二分查找和大O表示法