有序表查找---插值查找

插值查找和折半查找的思想是一样的,其代码机构也基本和折半查询相同:

//折半查找
	public int Binary_Search(int[] a, int n, int key) {
		int low = 1, high = n, mid;
		while(low <= high) {
			mid = (int)((low + high) / 2);
			if(key < a[mid]) {
				high = mid - 1;
			}
			else if(key > a[mid]) {
				low = mid + 1;
			}
			else return mid;
		}
		
		return 0;
	}

但是我们可能会碰到这种情况,要在取值范围0-10000之间100个元素从小到大均匀分布的数组中查找5,那么这个时候我们肯定考虑从数组下表较小的开始从查找而不是从中间的5000开始查找。
所以对于中间值下标的确定,mid=low+high2\frac{low+high}{2}2low+high=low+12\frac{1}{2}21(high - low)
将上述公式中12\frac{1}{2}21优化为:key−a[low]a[high]−a[low]\frac{key - a[low]}{a[high] - a[low]}a[high]a[low]keya[low]
则mid=key−a[low]a[high]−a[low]\frac{key - a[low]}{a[high] - a[low]}a[high]a[low]keya[low](high - low)

其时间复杂度和折半查询相同,但是对于表比较大,且关键字分布比较均匀的查找表来说,其平均性能优于折半查询。对于分布极端不均匀的数据,用插值并不合适。

转载于:https://www.cnblogs.com/lishanlei/p/10707802.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值