插值查找
插值查找,有序表的一种查找方式。插值查找是根据查找关键子与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率
插值查找: int mid = start + (end-start)*(targetValue-arr[start])/(arr[end]-arr[start]);
中间索引值 start表示数组的起始下标,end表示数组结束下标, targetValue表示要查找的数
利用自适应属性,让查找的值参与其中计算,估计要找的值得索引在哪,效率非常快
前提也是要查找的数组序列是有序的。
package com.wuzhixin.datastructrue;
import com.wuzhixin.test.Test;
/**
* 吴志新
* 2019/9/5-15:15
* _23designpatterns
**/
public class InsertValueSearch {
public static void main(String[] args) {
//int arr[] = new int[100];
/* for (int i = 0; i < arr.length; i++) {
arr[i]=i+1;
}
*/
int []arr = {1,8,10,89,1000,1000,1000,1234};
int i = insertValueSearch(arr, 0, arr.length - 1, 1234);
System.out.println("index = " + i);
}
public static int insertValueSearch(int arr[],int start,int end ,int targetValue){
System.out.println("8888888888888888888888888888");
if(start >= end || targetValue < arr[start] || targetValue > arr[end]){
return -1;
}
// 自适应函数 算法
int mid = start + (end-start)*(targetValue-arr[start])/(arr[end]-arr[start]);
if(targetValue>arr[mid]){
return insertValueSearch(arr,mid+1,end,targetValue);
}else if(targetValue<arr[mid]){
return insertValueSearch(arr,start,mid-1,targetValue);
}else{
return mid;
}
}
}
可以看到除了 求 中间索引的方式不一样,其他都是一样的
从下图中可以看到每次想查找 数组,找一次就可以找到 ,该算法适用于数据分布均匀的情况下使用,如果 左右两边的数据相差太大,可能效率并没有二分查找快