插值查找算法
一:插值查找介绍:
- 插值查找算法类似于二分查找法,但是不同的是二分查找法每次是从数组中间开始查找,但是插值查找每次从自适应mid处开始查找。
- 二分查找法获取mid是(left+right)/2,left表示数组最左边的下标值,right表示数组最右边的下标值。而插值查找算法获取mid是left + (right - left)*(value - array[left])/(array[right] - array[left]);需要注意的是插值查找算法有个前提是带查找的数组是有序,默认是数据从小到大排序。
二:举例说明插值查找算法
假设我们有一数组:array = [1,2,3,4,5,6…100]
现在我们要查找数据 1
使用二分查找法的话:mid会有多个值,才能找到
但是使用插值查找的话:根据公式
left + (right - left)*(value - array[left]) / (array[right] - array[left])=
0 + (99 - 0)*(1 - 1) / (100 - 0) = 0+0 = 0
所以mid的值为0,一次操作就找到了1的下标值效率会比二分查找法快很多
三:代码:
public class InsertSearch {
public static void main(String[] args) {
int[] array = new int[100];
for (int i = 0; i < 100; i++) {
array[i] = i+1;
}
array[98] = 100;
array[34] = 34;
array[35] = 34;
List<Integer> list = insertValueSearchs(array, 0, array.length - 1, 34);
System.out.println(list);
}
public static List<Integer> insertValueSearchs(int[] array,int left,int right,int value){
if (left>right||value<array[0]||value>array[array.length-1]){
return null;
}
int mid = left + (right-left)*(value-array[left])/(array[right]-array[left]);
int midValue = array[mid];
if (midValue>value){
return insertValueSearchs(array,left,mid-1,value);
}else if (midValue<value){
return insertValueSearchs(array,mid+1,right,value);
}else {
List<Integer> list = new ArrayList<>();
int temp = mid - 1;
while (true){
if (temp<0||array[temp]!=value){
break;
}
list.add(temp);
temp--;
}
list.add(mid);
temp = mid + 1;
while (true){
if (temp>array.length-1||array[temp]!=value){
break;
}
list.add(temp);
temp++;
}
return list;
}
}
}