算法 - 查找 - 插值查找 (Interpolation Search)
返回上级:算法 - 查找与排序 (Searching and Sorting)
本文将用C++实现通用模板插值查找算法,复制代码直接可使用。
在查看本文之前,需要一些程序语言的基础。
还需要熟悉 算法 - 查找 - 二分查找 (Binary Search) 。
文章目录
1 插值查找简述 (Introduction)
插值查找,它是二分查找的变种,它只适用于有序递增表。其时间复杂度 O(log2n) 。
插值查找改变了二分查找中原有的中值 mid 的求解方式,其 mid 不再代表中值,而是使用了一个插值公式:
m i d = l e f t + ( x − V a l [ l e f t ] ) × ( r i g h t − l e f t ) V a l [ r i g h t ] − V a l [ l e f t ] mid = left + \frac{(x - Val[left]) \times (right - left)}{Val[right] - Val[left]} mid=left+Val[right]−Val[left](x−Val[left])×(right−left)
假设表中有 n 个元素,查找过程为取区间中间元素的下标 mid ,对 mid 的关键字与给定值的关键字比较:
-
(1)如果与给定关键字相同,则查找成功,返回在表中的位置;
-
(2)如果给定关键字大,则更新左区间起始位置等于 mid + 1 ,即向右查找;
-
(3)如果给定关键字小,查找的值不在范围,直接返回;
-
(4)重复过程,直到找到关键字(成功)或区间为空集(失败)。
通常情况下:
-
返回值,代表下标;
-
返回-1,代表没有找到关键字;
之后的程序,我们以数组列表形式描述。
注意:代码全部使用std::vector<MyType>
作为数组列表,如果你用指针数组MyType*
,还需传入数组大小size
。
2 整型查找 (Interger Search)
一般举例中,查找最基本的元素本身就是整型。
// Author: https://blog.youkuaiyun.com/DarkRabbit
// Interpolation Search
// 模板有序递增表 - 插值查找 O(log2n)
// params:
// list: 查找的线性递增表
// element: 查找的元素
// return:
// int: 找到的下标,-1为表中没有
int InterpolationSearch(const std::vector<int>& list,
const int& element)
{
if (list.empty