这篇文章是介绍插值查算法的,你可以获得如下知识:
- 插值查找原理的
- 插值查找的java代码实现
- 建议这篇文章和查找算法001和起来看,不然你看不懂
- 本文参考尚硅谷视频。
一、插值查找介绍
1、原因分析
为什么不是二分查找就可以了呢?
比如我们要找1-1000里面的1,如果我们要找的话,要二分,然后再二分,二分到最后都要很久,但是我们的插值查找的话,我们就利用自适应来完成时间减少。提高效率。
1、分析实现原理
- 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。
- 将二分查找中的mid索引的公式,low表示左边索引,high表示右边索引,key就是我们要查找的值。
- int midIndex = low + (high - low)* (key - arr[low])/ (arr[high] - arr[low]);插值的索引
- 举例说明插值查找算法1-100的数组。
- 另外可以参考这篇文章介绍的自适应算法:文章链接
2、看一下照片分析
二、代码实现
package cn.mldn;
public class InsertSelectValue {
public static void main(String[] args) {
//生成测试数组
int[] arr = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i + 1;
}
System.out.println(InsertSelectValue(arr,0,arr.length - 1,100));
}
//插值查找,返回单个数据
//插值查找要求数组也是有序的
public static int InsertSelectValue(int[] arr,int left,int right,int findValue) {
//findValue < arr[0] || findValue > arr[arr.length - 1]
//这上面这两句话不要以为和二分查找一样啊,是不可以省略的。
if (left > right || findValue < arr[0] || findValue > arr[arr.length - 1]) {//递归结束条件
return -1;
}
//求出中间索引mid,这里是自适应算法。
int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
int midVal = arr[mid];
if (findValue > midVal) {//findValue > midVal向右边递归
return InsertSelectValue(arr,mid + 1,right,findValue);
} else if (findValue < midVal) {//findValue < midVal向左边递归
return InsertSelectValue(arr,left,mid - 1,findValue);
} else {//说明找到了
return mid;
}
}
}
三、其他的安排
1、作业
其他的可以实现返回多个的,各位可以参考我之前的二分查找,自己修改一下。
2、注意事项
- 对于数据量较大时,关键字分布比较均匀的查找表来说,采取插值查找速度比较快。
- 但是哦,但是,但是,数据分布不均匀的话,该方法是不一定比二分查找好的哦。