插值查找原理介绍:
1)插值查找算法类似手二分查找,不同的是插值查找每次从自适应mid处开始查找。
2)将折半查找中的求mid 素引的公式,low 表示左边索引left,high表示右边素引right.
key 就是前面我们讲的findVal
3) int mid = low + (high -1ow) * (key - arr[low])/(arr[high]-arr[low])//插值索引
对应前面的代码公式:
int mid = left + (right - left) * (findVal - arr[left])/ (arr[right]-arr[left])
插值查找注意事项:
1)对于数据量较大,关键宇分布比较均匀的查找表来说,采用插值查找,速度较快
2)关键字分布不均匀的情况下,该方法不一定比折半查找要好
package com.wrx.dataStructures.search;
import java.util.Arrays;
/**
* @auther Len901
* @time 2022-10-16-9:17
*/
//插值查找算法
/*
插值查找原理介绍:
1)插值查找算法类似手二分查找,不同的是插值查找每次从自适应mid处开始查找。
2)将折半查找中的求mid 素引的公式,low 表示左边索引left,high表示右边素引right.
key 就是前面我们讲的findVal
3) int mid = low + (high -1ow) * (key - arr[low])/(arr[high]-arr[low])//插值索引
对应前面的代码公式:
int mid = left + (right - left) * (findVal - arr[left])/ (arr[right]-arr[left])
插值查找注意事项:
1)对于数据量较大,关键宇分布比较均匀的查找表来说,采用插值查找,速度较快
2)关键字分布不均匀的情况下,该方法不一定比折半查找要好
*/
public class InsertValueSearch {
public static void main(String[] args) {
//创建一个1~100的数组
int []arr=new int[100];
for (int i=0;i<100;i++){
arr[i]=i+1;
}
int arr2[]={1,8,10,89,1000,1000,1000,1234};
System.out.println(Arrays.toString(arr));
int index=insertValueSearch(arr,0,arr.length-1,99);
System.out.println("您查找的数的索引为:"+index);
int index2=insertValueSearch(arr2,0,arr2.length-1,10);
System.out.println("您查找的数的索引为:"+index2);
}
//编写插值查找算法
//说明:插值查找算法,也要求数组是有序的
/**
*
* @param arr 数组
* @param left 左边索引
* @param right 右边索引
* @param findVal 查找值
* @return 如果找到,就返回对于的下标,如果没有找到,就返回-1
*/
public static int insertValueSearch(int[] arr, int left, int right, int findVal){
System.out.println("查找次数~");
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;
}
}
}