数据结构常用查找算法_插值查找
在考研路_数据结构_查找1中,我们发现,二分查找每次都是从中间开始查找,若我们查找的关键值是靠近上区间或下区间,则二分查找效率有待提高。
从而我们考虑修改的代码为:
mid = (low + high)/2 = low + (high - low)/2;
从而我们引入插值查找法,针对1/2,我们改为:
(key - a[low])/(a[high] - a[low]);
将1/2改为上述代码,使设置的mid值趋向所查找的关键值,将有效的提高查找的效率。
则mid赋值的代码为:
int mid = low + (high - low) * (key - a[low]) / (a[high] - a[low]);
所以插值查找代码如下:
int interpolation_Search(int *a, int n, int key)
{
int low = 0; /*设置下区间*/
int high = n; /*设置上区间*/
if(a[low] == key) /*判断是否为上下端点*/
return low;
if(a[high] == key)
return high;
while(low <= high)
{
int mid = low + (high - low) * (key - a[low]) / (a[high] - a[low]); //插值查找
if(a[mid] == key) /*查找到关键值并返回其下标值*/
return mid;
else if(a[mid] < key)
low = mid + 1; /*中间值比关键值小,则把中间值加1赋值给下一轮的下区间*/
else
high = mid - 1; /*中间值比关键值大,则把中间值减1赋值给下一轮的上区间*/
}
}
插值查找其时间复杂度为O(logn),建立在数据排好序,且均匀分布的情况下,其查找性能较二分查找好,但是如果数据分布不均匀,如{2,3,20022,30033,......,888888,888889}的话,其查找效果则不理想。
数据结构常用查找算法_斐波那契查找
除了插值查找法有效提高二分查找法的效率,斐波那契查找(Fibonacci Search),利用黄金分割原理也可提高查找效率。
利用斐波那契查找时,我们先需要有个斐波那契数列的数组。
斐波那契数列:{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,...}
斐波那契查找代码如下: