一、插值查找简介
插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。
原理分析
1)插值查找每次从自适应mid处开始查找
2)将折半查找中的求mid索引的公式,low表示左边索引,high表示右边索引
int mid =(low+high)/2= low + (high- low) /2 改为
int mid = low + (high- low) * (findValue- arr[low])/ (arr[high] - arr[low]);
3)其他同二分查找一样!
适用条件
适合于关键字值分布均匀的集合。
二、代码实现
从有序数组1-100中查找,若查找成功,返回索引;
package search;
public class InsertValueSearchTest {
public static void main(String[] args) {
//定义一个分布均匀的数组
int[] arr = new int[100];
for (int i=0;i<arr.length;i++){
arr[i] = i+1;
}
int findIndex = InsertValueSearch(arr, 0, arr.length - 1, 101);
if (findIndex != -1){
System.out.println("查找成功,返回索引findIndex ="+findIndex);
}else{
System.out.println("查找失败,数组中没有这个数!!");
}
}
public static int InsertValueSearch(int[] arr, int low, int high, int findValue) {
//low > high时,遍历完数组没有找到,此时必须加上两头判断,防止下标越界
if (low > high || findValue > arr[high] || findValue < arr[low]){
return -1;
}
int mid = low +(high -low)*(findValue -arr[low])/(arr[high]-arr[low]);//按比例查找定义中间值的索引
int midValue = arr[mid];//中间值
if (findValue > midValue){
return InsertValueSearch(arr,mid+1,high,findValue);
}else if (findValue < midValue){
return InsertValueSearch(arr,low,mid-1,findValue);
}else {
return mid;
}
}
}
截图
查找101
查找55