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

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

//折半查找
	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}=low+12\frac{1}{2}(high - low)
将上述公式中12\frac{1}{2}优化为:keya[low]a[high]a[low]\frac{key - a[low]}{a[high] - a[low]}
则mid=keya[low]a[high]a[low]\frac{key - a[low]}{a[high] - a[low]}(high - low)

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

posted @ 2019-03-10 20:31  如是说  阅读(346)  评论(0编辑  收藏  举报