插值查找
- 插值查找算法
- 插值查找算法是二分查找的进化版,就是优化了二分查找算法。
- 如果要查找的数组里有大量的元素,而这时需要查找的元素是第一个或者是最后一个,那么二分查找也需要耗费了一定的时间。
- 原因就是mid值每次都是在中间,为了解决这个问题,对二分查找进行了优化。
- 基本思想
- 插值查找的思路与二分查找的思路相同,都是用的递归。但是的话插值查找要在确定中间值的时候使用的是自适应算法,就是通过这个自适应算法可以通过很少的次数来查找到该值。
- 自适应算法是使用了需要查找的值来定位该值在整个数组里的位置,因此效率比较高
- 自适应算法公式:mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
- 插值查找比较适用于数组里元素比较连续的大量数据元素的查找,但是对于数组里的元素很分散的话,效果可能还不如二分查找。
代码实现
public class InsertSearchDemo {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
System.out.println(insertSearch(arr, 0, arr.length - 1, 7));
}
public static int insertSearch(int[] arr, int left, int right, int number) {
if (left > right || number < arr[left] || number > arr[right]) {
return -1;
}
int mid = left + (right - left) * (number - arr[left]) / (arr[right] - arr[left]);
int val = arr[mid];
if (number > val) {
return insertSearch(arr, mid + 1, right, number);
}
else if (number < val) {
return insertSearch(arr, left, mid - 1, number);
}
else {
return mid;
}
}
}