Answers:
显然,要进行插值搜索,您需要某种类型的键,而其已知性远不止排序-您必须能够对键进行计算以估计可能的距离,而不仅仅是比较键以确定哪个更大或更大。小一点。
就数据集的属性而言,它主要涉及一种属性:键在整个可能性范围内合理地平均分布(或至少可预测地)的可能性。否则,插值搜索实际上可能比二进制搜索慢。
例如,考虑以小写字母字符串作为键的数据集。假设您有一个以“ x”开头的密钥。插值搜索将清楚地表明您应该从集合的末尾开始搜索。但是,如果大多数键实际上以'z'开头,而几乎没有键以'a'到'y'开头,那么实际上您正在搜索的键可能非常接近集合的开头。在搜索接近以“ w”开头的字符串所在的开始位置之前,可能/可能需要进行大量迭代。每次迭代仅会删除大约10%的数据集,因此在接近以'w'开头的键的开始之前,将需要进行多次迭代。
相比之下,二进制搜索将从中间开始,在第二次迭代时达到四分之一标记,在第三次迭代中达到八分之一标记,依此类推。其性能几乎不会受到琴键偏斜的影响。每次迭代都会从考虑中删除一半的数据集,就像密钥是均匀分布的一样。
但是,我必须补充一点,它确实需要相当偏斜的分布才能使插值搜索明显比二进制搜索差。例如,即使存在大量本地化集群,它也可以表现出色。
我还应该提到,插值搜索不一定需要使用线性插值。例如,如果已知您的键遵循某种非线性分布(例如,钟形曲线),则在插值函数中将其考虑在内变得相当容易,从而获得与均匀分布几乎没有什么不同的结果。
a
但是,以开头的单个异常会严重影响性能。
我可能会想,问题是您能轻松地得出比二进制搜索更好的插值函数。
使用big-O表示法,对大小为N的数据集的插值算法的性能为O(N);但是,在用于插值的线性标度上均匀分布数据的假设下,性能可以显示为O(log log N)。
内插搜索的实际性能取决于每个探针所需的更复杂的计算是否会减少探针数量的减少。在磁盘上的大文件中查找记录时很有用,因为每个探针都涉及磁盘搜索,并且比插值算法慢得多。
诸如B树之类的索引结构还减少了磁盘访问次数,并且更常用于索引磁盘上的数据,部分原因是它们可以索引许多类型的数据并可以在线更新。尽管如此,当人们不得不搜索某些已排序但未索引的磁盘数据集时,插值搜索还是有用的。
二进制搜索和内插搜索均被视为线性搜索方法。
他们俩都希望被搜索的列表在被称为键的列上进行排序。这个非常重要。
只要按顺序存储二进制或字符串,二进制搜索就会起作用。二进制搜索的主要思想是它基于检查中间元素。插值搜索是一种变体。它没有使用确切的中间元素,而是猜测要与传递的值进行比较的下一个元素在哪里。有关插值搜索算法如何计算下一个键值的详细信息,请参见JB King答案提供的参考或该答案下面的参考。
“插值搜索仅对以均匀排列的排列数组顺序排列的数字元素起作用(即,任意元素到连续元素之间的间隔大致恒定”(引自P 737以下的引用,还包括不同线性搜索方法之间的性能比较) )。