码迷,mamicode.com
首页 > 其他好文 > 详细

插值查找

时间:2019-11-10 11:50:51      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:htm   https   turn   算法   超链接   struct   code   完成   公式   

概念介绍

  有同学想了解插值查找,今天它来了!想了解插值查找,就得先了解二分查找的原理,对于不知道二分查找的小伙伴,可以去简单学习一下,送上超链接https://www.cnblogs.com/maguanyue/p/11675567.html。插值查找和二分查找十分的相似,它们唯一的区别就是:二分查找的每次查找点=(最大值+最小值)/2,是一个固定值。而插值查找的每次查找点的下标=最小值+ (最大值- 最小值) * (目标值- a[最小值下表]) / (a[最大值下表] - a[最小值下表]),这样做的目的是为了使得查找点变为自适应选择,从而提高查找的效率。

  我们还是用二分查找中的数组举例子,这次我们的需求是在arr=[1,3,5,7,9,10,13,18],找到1。

  二分查找:

  在二分查找的算法中记录被调用打印日志,说明二分查找被调用了。

技术图片

  二分查找的过程在这里我们就不进行推导了,直接看二分查找的结果。

  对二分查找进行调用。

技术图片

  结果:

技术图片

  说明在arr=[1,3,5,7,9,10,13,18],找到1,二分查找被调用了3次。

  插值查找:

  先带入公式,获取中值及其下标int mid = start + (end - start) * (findValue - arr[start]) / (arr[end] - arr[start]),int midValue = arr[mid];

  int mid = 0+(7-0)*(1-1)/(18-1)=0,int midValue = arr[0]=1,找到目标值,而且只是一次。

  咱们看看代码,对插值查找进行调用:

技术图片

   看一下插值查找调用结果:

技术图片

   说明插值查找只被调用了1次,就找到了目标值,是不是感觉很爽。既然有了插值查找,我们是不是不需要知道二分查找了呢?答案是否定的,对于元素分布比较均匀的查找表来说,采用插值查找,速度是比较快的,但是分布不均匀的情况下,插值查找不一定比二分查找好。

代码实现

  插值查找和二分查找代码及其相似,相信大家很快就能明白,仅有获取中值的方式不同罢了。

 1     public static int insertValueSearch(int[] arr, int start, int end, int findValue) {
 2         System.out.println("插值查找被调用了!");
 3         if (end > start || findValue < arr[0] || findValue > arr[arr.length - 1]) {
 4             return -1;
 5         }
 6 
 7         // 动态获取中值及其下标
 8         int mid = start + (end - start) * (findValue - arr[start]) / (arr[end] - arr[start]);
 9         int midValue = arr[mid];
10 
11         // 比较中值:右递归的情况
12         if (findValue > midValue) {
13             return insertValueSearch(arr, mid + 1, end, findValue);
14             // 比较中值:左递归的情况
15         } else if (findValue < midValue) {
16             return insertValueSearch(arr, start, mid - 1, findValue);
17         } else {
18             return mid;
19         }
20     }

  至此,代码编写完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于algorithm工程下的search目录InsertValueSearch,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多查找算法!

插值查找

标签:htm   https   turn   算法   超链接   struct   code   完成   公式   

原文地址:https://www.cnblogs.com/maguanyue/p/11769283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!