考研路_数据结构_查找2_插值查找和斐波那契查找

4 篇文章 0 订阅
3 篇文章 0 订阅

数据结构常用查找算法_插值查找
在考研路_数据结构_查找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,...}

斐波那契查找代码如下:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值