插值查找算法
原理介绍:
类似于二分查找法,关于二分查找法的具体过程,请参考这一篇小兑幂的男神写的关于二分查找法的文章。
唯一的区别是对middle值进行自适应
middle的值由原来的:
int middle = (left + right) / 2;
变成了:
middle=left+(right-left)*(target-arr[left])/arr[right]-arr[left]
和输入target的值有关,其余的算法过程和二分查找法一致,从而实现了自适应。
算法实现
package com.njupt.search.charu;
/**
* Creat with IntelliJ IDEA
*
* @Auther:倔强的加瓦
* @Date:2021/07/21/17:07
* @Description:对二分查找的再次改进,自适应方案。
*/
public class Insert {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i;
}
int targetIndex = insert(arr, 0, arr.length - 1, 2);
System.out.println(targetIndex);
}
public static int insert(int[] arr, int left, int right, int target) {
//和二分法的区别就在于middle的取值是自适应的,和所要查找的值是有关的
// middle=left+(right-left)*(target-arr[left])/arr[right]-arr[left]
//只需要一次就可以找到。
if (left > right) {
return -1;
}
int middle = left + (right - left) * (target - arr[left]) / arr[right] - arr[left];
if (target > arr[middle]) {
return insert(arr, middle + 1, right, target);
} else if (target < arr[middle]) {
return insert(arr, left, middle - 1, target);
} else {
return middle;
}
}
}
查找速度测试
用二分查找法进行查找的次数,需要5次
此次查找的递归查找次数
此次查找的递归查找次数
此次查找的递归查找次数
此次查找的递归查找次数
此次查找的递归查找次数
2
而利用插值查找法之后,只需要一次就可以找到!
此次查找的递归查找次数
2
插值查找法的注意事项:
对于数据量较大,关键字分布比较均匀的查找表来说采用插值查找法比较快
但是关键字分布不均匀的时候,改方法不一定比二分查找好!