用于在有序数列表中查找数字记录的算法

时间:2010-04-23 08:46:33

标签: database algorithm indexing

我有一个未完整的有序号码列表。我希望尽可能少地找到一个特定的数字。

此算法是否有任何改进,我假设您可以毫无困难地计算设置大小 - 每次添加新项目时都会存储和更新。

您的目标是将光标放在值x

第一个数字(最小)是s,最后一个数字(最大)是g。

  1. 取集合的中点m1:calculate is x< M1,
  2. 如果是,则s< = x< M1
  3. 如果否,那么m1< x< = g
  4. 如果m1 = x那么你就完成了。
  5. 不断重复,直至找到x。每次迭代基本上将集合分成两部分,直到你达到x。

    目的是从非常大的表中检索数字id,然后找到相关的其他记录。

    我认为这是最简单的索引类型,有改进吗?

3 个答案:

答案 0 :(得分:2)

如果要使用有序数据结构,二进制搜索在渐近意义上是最佳的。但是,如果您使用辅助树,如果您注意地点,则可以在时间性能方面获得很大的常数因素。

具体来说,如果您从磁盘访问数据,那么磁盘访问时间将主导其他所有内容。在这种情况下,您希望减少需要从磁盘中随机访问的不同数据块的数量。这就是B树,B +树等类似的东西:它们以树的形式存储数据,并确保节点有很大的扇出,这样它们就可以限制深度,因此不需要做很多事情。许多随机寻求。

如果在ram中访问数据,你可以通过关注缓存行来做类似的事情; Judy trees就是一个例子。

如果您正在进行完全匹配,则可以在恒定时间内进行散列 - 无论您的号码是否已订购。然而,散列可能会在时间和空间上产生巨大的开销,并且有序的方法通常具有竞争力,因此您确实希望根据具体情况做出决定。

答案 1 :(得分:1)

二进制搜索快速,非常快......


您可能希望将优化工作重点放在此处:

  • 为数字字段使用高效数据类型

  • 减少重复访问到相同的字段。


此外,您可能希望了解这些以自己实现类似的代码:

  

古德纳克!!

答案 2 :(得分:1)

正如其他人所提到的,你已经描述了binary search。虽然听起来很容易实现,但是如果你不小心的话,还有一些细微差别会让你感到害怕。建议您阅读维基百科链接的this section以了解它们。