【发布时间】: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/…