什么是插值查找
插值查找(按比例查找)是在折半查找算法的基础上演变而来。举个例子,在牛津词典查找“apple”单词,你会首先发开字典的中间部分然后再折半吗?一般不会,我们更通常的做法是往字典的最前部分翻去。而查找“zero”则相反,我们会下意识的往字典最后部分翻去。
鉴于这种常识,我们认为可以再折半查找算法的基础上进行改造,因此诞生了插值查找,也叫按比例查找。该查找是按照一定比例去修改每次分割的值,所以在折半查找法的代码上,只修改mid的求职算法即可。
插值查找在增长均匀的元素序列中效率最高(比折半查找高),在增长差异大的元素序列中效率最差(比折半查找低)。
实现代码
package test.algorithm.FastSlowPointer;
/**
* 插值查找
* @author serenity
*
*/
public class BinSearch {
/**
* 插值查找
* 返回元素位置,没找到返回-1
* @param data
* @param key
* @return
*/
public static int binarySearch(int[] data , int key){
int low = 0;
int high = data.length-1;
int mid = 0;
int flag = -1;
int count = 0;
while(low<=high){
count++;
//插值查找和二分查找的唯一不同点,通过计算获取更精确的 mid值,
//该方法在元素均匀递增中效率最高
mid = low + (high - low) * (key - data[low]) / (data[high] - data[low]);
if(key<data[mid]){
//待查找值s小于中值
high = mid-1;
}else if(key>data[mid]){
//待查找值s大于中值
low = mid+1;
}else{
//待查找值s等于中值
flag = mid;
break;
}
}
System.out.println("查找次数:"+count);
return flag;
}
public static void main(String[] args) {
int[] data = {1,2,3,4,5,6,7,8,9,10};
System.out.print("数组:");
for(int i : data){
System.out.print(i+" ");
}
System.out.println();
int search = 2;
int position = binarySearch(data,search);
System.out.println("值"+search+"的元素位置为:"+position);
}
}