algorithm - 动态范围搜索

标签 algorithm data-structures computer-science

<分区>

Possible Duplicate:
Fast Algorithm to Quickly Find the Range a Number Belongs to in a Set of Ranges?

给定一个不重叠且排序的数字范围列表 (rangeList) 和一个数字,编写一个高效的算法首先查找该数字是否存在于(某个范围内)rangeList 中,如果存在,则返回正确的范围。

例如 rangeList = [(-1, 200), (300, 2000), (2011, 2300)]

查询 1:1000 -> (True, (300, 2000) ) 因为 1000 介于 300 和 2000 之间。

查询 2:250 -> (False, (None, None) ) 因为没有 250 在列表的任何范围内都不存在。

我想出的最好的算法是使用二进制搜索的 log N。这感觉像是一个非常普遍的问题,尤其是对于基于经度/纬度的搜索。有什么想法可以使它比 log N 更好吗?

最佳答案

我不确定这是否会实现您想要的,但这是一次尝试。它将涉及 O(n) 预处理步骤,作为返回,将为任何给定的查询提供 O(1) 运行时间的机会,以平衡空间复杂性(通过参数 c)。如果您的 rangeList 经常更改,这可能没有帮助。

预处理步骤:

  1. 找到范围列表的“总范围”(可接受的最低值和最高值,尽管两者之间会有差距)。 O(1)

  2. 选择浓度参数 c(整数)作为您希望在该范围内评估的点数。 O(1)

  3. 创建一个映射函数,将整数 [1, c] 映射到步骤 1 中找到的总范围,也可以进行逆运算(这并不比摄氏-华氏转换复杂)。也是 O(1)

  4. 利用映射函数,确定总范围内对应[1,c]的点。扫描范围列表,边走边评估这些点,将答案((True, (300, 2000)))存储在长度为 c 的数组中(我们称该数组为“已评估”)。 O(n+c)

收到查询后:

  1. 利用映射函数将查询数在“总范围”->[1,c]方向进行转换。如果转换后的数字超出 [1, c] 范围,则返回 (False, None, None)。 O(1)

  2. 取转换后数字的上限和下限,得到两个整数 a 和 b。比较 Evaluated[a] 和 Evaluated[b]。如果它们包含相同的答案,则返回它(如果您转换后的数字已经是整数,则直接返回 Evaluated[converted number])。 O(1)

  3. 如果 Evaluated[a] 和 Evaluated[b] 给出不同的答案,则必须进行二分查找。但是您至少可以在 a 和 b 之间的中间开始搜索,映射回“总范围”。

关于algorithm - 动态范围搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262606/

相关文章:

arrays - 最小化创建非递减数组成本的动态规划问题

python - 从子集集中创建新的子集集(python)

algorithm - 具有非成对互质模的同余系统

accessibility - 对于盲人程序员来说,有哪些好的计算机科学资源?

algorithm - 基于动态规划的字符串

java - 日出时间计算与谷歌的结果不符

algorithm - 将优化什么数据结构来表示股票市场?

database - 多数据库的通用信息模式

algorithm - 您如何模拟具有两个无界堆栈和少量内存的数组?

naming-conventions - 是否有常规同义词用于替换编程语言中保留的关键字?