二进制搜索和插值搜索相结合背后是否有任何研究或理论?


14

我刚刚读过该算法是否仍可以视为二进制搜索算法?并回顾了几年前,我写了一个索引器/搜索日志文件,以按日期/时间窗口在大型纯文本文件中查找日志条目。

在这样做的同时,我决定尝试插值搜索(我不知道那是什么,我自己偶然发现了这个想法)。然后出于某种原因,我继续采用交替插值步骤与二进制拆分步骤的想法:在步骤0上,我将进行插值以确定测试点,然后在步骤1上,我将采用精确的中点等。

然后,我使用纯插值搜索,纯二进制搜索和组合尝试对系统进行了基准测试。在找到一组随机选择的时间之前,在时间和所需测试数量上,交替方法无疑是赢家。

受链接问题的启发,我只是快速搜索了“交替插值搜索和二进制搜索”,却一无所获。我还尝试了“对冲插值搜索”,如对某个答案的评论所建议的那样。

我偶然发现了一个已知的东西吗?对于某些类型的数据,它有更快的速度吗?日志文件通常在时间上很大(例如1-2 GB的文本,可能要搜索1000万行),并且日期/时间在其中的分布非常复杂,包括大量的活动,一般的高峰时间和安静时间。我的基准测试是从均匀分布的目标时间中采样得出的。

Answers:


5

我偶然发现了一个已知的东西吗?

ØØG ØG ñØØG ñ

  • 内省搜索是您的方法(在内插搜索和二进制搜索之间进行迭代)。我没有进一步的细节。
  • N. Santoro,JB Sidney(1985)的插值二分搜索(IBS)。

    一般想法是,仅当搜索的数组大于给定阈值时,插值搜索才有用。当考虑的搜索段小于用户定义的阈值时,将无条件应用二进制搜索。反之亦然,在该阈值之上,将应用插值搜索步骤,然后最终执行二进制搜索步骤。

    这与您的方法有很多共同点。

  • Biagio Bonasera,Emilio Ferrara,Giacomo Fiumara,Francesco Pagano,Alessandro Provetti的自适应搜索(AS)

    用作者的话:

    [插值二进制搜索]设计了一种类似的解决方案,将插值和二进制搜索结合在一起(但不融合)。尽管渐进复杂度相同,但仍存在一些明显的差异。

    [切]

    因此,有可能表明,对于任何输入,AS都不会比IBS进行更多的基本操作。

    与“简单”插值搜索相比,该算法可能要花费多达两倍的运算量,才能仔细地找出搜索片段的最佳二等分,这反过来意味着将需要较少的迭代来完成(但是您的开销更大) 。


6

交织两种算法来获得最佳性能是一种已知技术,尽管通常将其描述为以“并行”方式运行它们,并在任一终止时立即返回答案。

尽管从理论上讲更快,但是与二进制搜索相比,插值搜索有两个缺点:

  • 它具有糟糕的(线性)最坏情况性能

  • 计算中点的开销相当大。二进制搜索迭代比插值搜索快数百倍

我希望这样一种方法是最有效的,即在范围较大时进行插值搜索,而在范围较小时切换为二进制搜索。如果您可以尝试此实验,那就太好了。

日志ñ日志日志ñ日志ñ日志日志ñ

我认为您的结果可以用两种现象来解释:

  • 与二进制搜索结合使用,可以避免出现最坏情况

  • 在小型数据集上切换到二进制搜索的积极效果


3
您写道:“二进制搜索迭代比插值搜索迭代快数百倍”。请注意,在OP的情况下,这两种方法计算中点之间的差异与检索中点值所需的I / O时间相形见war。
liori

@liori:对相同数据进行重复二进制搜索的前几次迭代可能更易于缓存,因为使用了相同的几个元素。因此,可以预期四分之一甚至八分之一会在缓存中保持高温。如果范围足够大,则从二进制开始并在三个迭代之后切换到插值可能是有意义的。(或者,如果您可以执行异步I / O并使用最先到达的结果)。
彼得·科德斯

同样,即使对于内存中搜索,高速缓存未命中(超过200个周期的延迟)的延迟甚至是64位整数除法(32-96周期)的几倍,例如在Intel Haswell上。32位整数除法明显更快(22-29个周期)。主内存带宽是所有内核的共享资源,但是整数除法仅使用每个内核上重复的资源。
彼得·科德斯

2
但是,内存延迟要比内存带宽差得多,因为即使多个分散的访问同时发生,访问速度也会更快。对于现代x86硬件上的内存内bsearch,在加载当前中点之前预取(带有prefetcht0指令)这两种可能性是一个胜利。如果您无法提前预测下一个提取地址,则无法执行此操作。因此,除了理论上的考虑之外,实际的实现细节也很重要
彼得·科德斯

@liori:索引日志文件时,绝对是每个中点的I / O是主要因素,因为它是按需读取以查找记录。计算文件中的偏移量和读取块之间可能有两个以上的数量级-因此,计算出的中点数将成为决定因素。我认为,如果我现在复制而没有日志文件要建立索引(我将尝试在此处发布),则速度差异可能无法衡量,但“所需的中点数量”差异可能会存在。
尼尔·斯莱特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.