插值查找
插值查找算法的举例说明 数组arr=[1, 2, 3, …100]
假如我们需要查找的值1
使用二分查找的话,我们需要多次递归,才能找到1
使用插值查找算法
int mid= left+ (right- left) * (findVyal-arr[left]) / (arr[right] -arr[left])
int mid=0+(99-0)* (1- 1)/(100-1)=0+990/99=0
比如我们查找的值100
int mid=0 +(99-0) (100-1)/(100-1)=0+99寨99/99=0+99= 99
需要注意:
1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快.
2)关键字 分布不均匀的情况下,该方法不一定比折半查找要好
package search;
import java.util.Arrays;
public class InsertValueSearch {
public static void main(String[] args) {
int [] arr = new int[100];
for (int i = 0;i < 100;i++){
arr[i] = i+1;
}
System.out.println("index = "+insertValueSearch(arr,0,arr.length-1,1));
}
//插值查找
/**
*数组需要有序
* @param arr 数组
* @param left 左边索引
* @param right 右边索引
* @param findVal 查找值
* @return
*/
public static int insertValueSearch(int[] arr,int left,int right,int findVal){
//findVal < arr[0] || findVal > arr[arr.length - 1] 必须有
if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1] ){
return -1;
}
//自适应mid
int mid = left + ( right - left ) * (findVal - arr[left])/(arr[right] - arr[left]);
int midVal = arr[mid];
if (findVal > midVal ){
return insertValueSearch(arr,mid +1,right,findVal);
}else if (findVal < midVal){
return insertValueSearch(arr,left,mid-1,findVal);
}else {
return mid;
}
}
}