我有一个未完整的有序号码列表。我希望尽可能少地找到一个特定的数字。
此算法是否有任何改进,我假设您可以毫无困难地计算设置大小 - 每次添加新项目时都会存储和更新。
您的目标是将光标放在值x
上第一个数字(最小)是s,最后一个数字(最大)是g。
不断重复,直至找到x。每次迭代基本上将集合分成两部分,直到你达到x。
目的是从非常大的表中检索数字id,然后找到相关的其他记录。
我认为这是最简单的索引类型,有改进吗?
答案 0 :(得分:2)
如果要使用有序数据结构,二进制搜索在渐近意义上是最佳的。但是,如果您使用辅助树,如果您注意地点,则可以在时间性能方面获得很大的常数因素。
具体来说,如果您从磁盘访问数据,那么磁盘访问时间将主导其他所有内容。在这种情况下,您希望减少需要从磁盘中随机访问的不同数据块的数量。这就是B树,B +树等类似的东西:它们以树的形式存储数据,并确保节点有很大的扇出,这样它们就可以限制深度,因此不需要做很多事情。许多随机寻求。
如果在ram中访问数据,你可以通过关注缓存行来做类似的事情; Judy trees就是一个例子。
如果您正在进行完全匹配,则可以在恒定时间内进行散列 - 无论您的号码是否已订购。然而,散列可能会在时间和空间上产生巨大的开销,并且有序的方法通常具有竞争力,因此您确实希望根据具体情况做出决定。
答案 1 :(得分:1)
您可能希望将优化工作重点放在此处:
为数字字段使用高效数据类型。
减少重复访问到相同的字段。
此外,您可能希望了解这些以自己实现类似的代码:
古德纳克!!
答案 2 :(得分:1)
正如其他人所提到的,你已经描述了binary search。虽然听起来很容易实现,但是如果你不小心的话,还有一些细微差别会让你感到害怕。建议您阅读维基百科链接的this section以了解它们。