9.7.4 插值查找
2025年09月21日
9.7.4 插值查找
在介绍插值查找之前,首先考虑一个问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢?
举个例子,在英文字典里面查“apple”,人会下意识翻开字典是翻前面的书页还是后面的书页呢?如果再想查“zoo”,又怎么查?很显然,这里绝对不会是从中间开始查起,而是有一定目的的往前或往后翻。同样的,比如要在取值范围1~10000 100个元素从小到大均匀分布的数组中查找5,我们自然会考虑从数组下标较小的开始查找。
通过以上分析,折半查找这种查找方式,不是自适应的。
插值查找的关键是将二分查找中

改进为:

也就是将上述的比例参数1/2改进为自适应的,根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。
插值查找(Interpolation Search)是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法。其前提条件是符号表有序。
对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。
插值算法的时间复杂度仍然为O(log n)。