【问题标题】:Binary Search, Speed up using a nearby index二分搜索,使用附近索引加速
【发布时间】:2014-07-31 14:58:09
【问题描述】:

当对大量数据进行多次二分搜索时,搜索附近的值可用于减少搜索的大小。

举个简单的例子,假设我们正在搜索一个范围......

for k in range(n):
    i = binary_search(data, k)
    # operate on `i`

有两个明显的优化。

  • 使用前一个索引作为二分查找的第一项。
  • 检查数组匹配中的下一项(如果匹配的机会很高,这可能很有用)。

但是,由于k 是有序的,应该可以将先前的索引传递给binary_search 并且(在大多数情况下)减少平分范围所需的次数。

所以它看起来像这样:

i_prev = 0
for k in range(n):
    i = binary_search(data, k, index_near=i_prev)
    i_prev = i
    # operate on `i`

是否有一种众所周知的方法可以使用先前找到的索引来优化二分搜索?

更新

似乎一个不错的方法可能是使用疾驰搜索和二分搜索,使用疾驰搜索与前一个索引来定义范围,然后调用常规二分搜索函数。 这样做的一个优点是它不会使二进制搜索代码复杂化(它可以保持一个小循环,只做简单的操作)。 这种方法的另一个优点是疾驰搜索可以双向进行,因此传入的索引可以或多或少然后是正在搜索的索引。 我需要检查一下,可能单独进行快速搜索就足够了,只需搜索直到找到的项目,而不是使用来定义二进制搜索的限制。

【问题讨论】:

  • 如果您知道连续的 k 值在增加,则不要在区间 [0,n] 中搜索,而是在 [iprev,n] 中搜索。
  • 你可以在这里尝试使用疾驰搜索而不是二分搜索。
  • @Henry,是的,事实上我已经尝试了很多不同的方法,但是为了保持问题的简洁,我认为最好不要回顾所有可能的改进。
  • @tmyklebu 好点,在想也许可以通过疾驰搜索来定义范围,然后也调用二分搜索。需要进行一些实验。
  • 博文 - 与此主题相关:blog.teamleadnet.com/2014/06/…

标签: algorithm binary-search


【解决方案1】:

这取决于使用索引的具体程度。

最明显的使用方法是根据一些高斯分布来选择中间元素,该分布以最后一个元素为中心,宽度由预期的接近度决定。

这将是interpolation search 的一种形式,通常使用线性插值来搜索均匀分布的数据。

此类方法很少使用,因为它们需要深入了解预期的数据分布。很少值得付出努力。充其量,您可以节省 25-30 次比较,搜索十亿个元素数组,而如果启发式方法关闭或数据不像想象的那样,算法可能会使用更多的数百万次比较。

同时,基本的二分搜索已经实现、调试并准备就绪,并保证您每次都得到 log2(n) 比较的结果。

【讨论】:

  • 2 应该是指数还是基数?如果是基地,那就是多余的。
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2014-04-14
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多