@查找算法:二分法与插值的详细分析

  • 1、简单的二分法查找
    • 1.1、算法分析
    • 1.2、画图分析
    • 1.3、代码实现1:递归法
    • 1.3、代码实现2:循环法
  • 2、二分微改版:插值查找
    • 2.1、算法分析
    • 2.2、额,这个图就不画了,和二分差不多
    • 2.3、代码实现(递归法,循环请参考二分法的思路):
  • 3、总结

1、简单的二分法查找


1.1、算法分析

二分法,顾名思义,就是对其进行折半分别在两边查找。两边再分别进行折半、查找,再折半、再查找,直到找到为止,或者整个数组都找不到这个值,应立即结束查找。

1.2、画图分析

1.3、代码实现1:递归法

/*** * @param arr 查询的数组* @param value 查询的值* @return 查询到的值的索引*/public static int ef(int arr[], int value) {int left = 0;int right = arr.length - 1;int mid = 0;while (left <= right) {mid = (left + right) >> 1;if (value > arr[mid]) {left = mid + 1;} else if (value < arr[mid]) {right = mid - 1;} else {return mid;}}return -1;}

1.3、代码实现2:循环法

/*** * @param arr 查询的数组* @param value 查询的值* @return 查询到的值的索引*/public static int ef(int arr[], int value) {int left = 0;int right = arr.length - 1;int mid = 0;while (left <= right) {mid = (left + right) >> 1;if (value > arr[mid]) {left = mid + 1;} else if (value < arr[mid]) {right = mid - 1;} else {return mid;}}return -1;}

2、二分微改版:插值查找


2.1、算法分析

相比于二分法的折半,插值就相当于折插值数,至于什么是折插值数,我们需要先了解一下它的公式:

  • 二分法:mid = (left + right) >> 1 (较简单,就不做过多的介绍了!!)
  • *插值法:mid = left + (value-arr[left]) * (right - left) / (arr[right] - arr[left])
  • 首先,在使用插值法之前,我们需要先了解插值法的使用条件:必须是一个已排序的数组,这一点和二分法一样,但如果要体现其价值,则必须是一个已排序的连续分布均匀的数组,因为在这样的数组中,无论查哪一个元素,都只用一次就能查询到这个值。至于为什么只用了一次,我们还得回到其公式上面,为了便于理解,先假设有一个连续分布均匀的数组,接下来的说明皆围绕该例子
                                                               arr[] = {1,2,3,4,5,6};
    对于插值法的公式,我们根据其条件可以发现 (right - left) => (arr[right] - arr[left]),因为连续分布的特性,索引和元素的差值是成正比的,如果连续分布的元素差值为1,则可以发现(right - left) =(arr[right] - arr[left]),所以,根据其正比例的关系,我们可以将公式化简为 : mid = left + value - arr[left],这样一来,我们就能很清晰的观察其规律了,left为左边界,value - arr[left]的结果为left到value索引处元素的差值, 以arr为例,假设我们要查找3这个元素,那么套用公式就是 mid = 0 + 3 - 1 = 2,而arr[2]刚好等于3,注意,上面的化简公式只是为了方便理解而推论的,只适用于连续排列差值为1的数组,对于其他分布的数组并不适用,还是用插值法的公式,对于其他分布的数组来说, (right - left) / (arr[right] - arr[left])的值就是该数组的分布比例, (value-arr[left]) 是要查找的值与左边界的差值,用该差值/分布比例,就能得到要查找的值value的索引,再用该索引 - 左边界,得到的值就是要查找的值的索引。
  • 公式总结:mid = left + (value-arr[left]) * (right - left) / (arr[right] - arr[left])

    • (right - left) / (arr[right] - arr[left]):数组的比例关系
    • (value-arr[left]):左边界元素(相当于0)到value的元素差值(通俗说就是从0到查找处元素的差值)
    • left:当前的左边界(并非一直为0,如果一次查找不到左边界响应也会发生变化)

2.2、额,这个图就不画了,和二分差不多

2.3、代码实现(递归法,循环请参考二分法的思路):

public static int insertValSearch(int arr[],int left,int right,int value) {if(left>right ) {return -1;}System.out.println("aaa");//自适应:如果是一个连续的有序数组,那么可以自适应,只需要一次能查到//如果是一个非连续的有序数组,那么只能适应两端,两端之内的值则和二分一样int mid = left + (right-left)*(value-arr[left])/(arr[right]-arr[left]);
//      System.out.println(mid);
//      int mid = left + value - arr[left];System.out.println(mid);if(value>arr[mid]) {return insertValSearch(arr, mid+1, right, value);}else if(value<arr[mid]) {return insertValSearch(arr, left, mid-1, value);}else {return mid;}}

3、总结

越努力,越幸运,The harder you work, the more luck you have.

关注笔笔一起努力吧ヾ(◍°∇°◍)ノ゙!!!

查找算法:二分法,插值法的公式详解——菜鸟进阶的必经之路!!!相关推荐

  1. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  2. 二分法、三分法的详解

    二分法.三分法的详解 这两种方法都是对数据查找的一种高效率方式 二分法 二分查找是一种算法,也叫折半查找,在某些情况下相比较顺序查找,使用二分法查找的效率更高,但是使用该算法的前提是:查找的数据必须是 ...

  3. java list 重复数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  4. java 找出重复的数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  5. 2位专家耗时2年打造,西瓜书机器学习公式详解,都在这里了!(文末留言赠书)...

    作为机器学习的入门经典教材,周志华老师的<机器学习>,自2016年1月底出版以来,首印5000册一周售罄,并在8个月内重印9次.先后登上了亚马逊,京东,当当网等的计算机类畅销书榜首,身边学 ...

  6. 【吃瓜教程】《机器学习公式详解》西瓜书与南瓜书公式推导

    [吃瓜教程]<机器学习公式详解>西瓜书与南瓜书公式推导 2021年7月11日 第0章-导学 深度学习:狭义地来说,就是具有较多层的神经网络. 整个学习过程; 先看西瓜书,在看 Datawh ...

  7. 神经网络的函数表达式,神经网络公式详解pdf

    1.神经网络的准确率是怎么计算的? 其实神经网络的准确率的标准是自己定义的. 我把你的例子赋予某种意义讲解: 1,期望输出[1 0 0 1],每个元素代表一个属性是否存在.像着4个元素分别表示:是否肺 ...

  8. 《算法导论》红黑树详解(一):概念

    在学习红黑树之前,读者应先掌握二叉查找树的相关知识.学习红黑树或者二叉查找树,推荐大家看<算法导论>.<算法导论>原书第3版 高清PDF 带详细书签目录下载 密码:acis & ...

  9. 【数据结构与算法】哈希算法的原理和应用详解!

    在程序员的实际开发中,哈希算法常常能用得到,本文以哈希算法的原理和应用为核心,和大家详细讲解一下哈希算法的概念.常见算法以及原理.在信息安全的应用等等. 一.概念 哈希表就是一种以 键-值(key-i ...

  10. python数组对应元素相乘_python的几种矩阵相乘的公式详解

    1. 同线性代数中矩阵乘法的定义: np.dot() np.dot(A, B):对于二维矩阵,计算真正意义上的矩阵乘积,同线性代数中矩阵乘法的定义.对于一维矩阵,计算两者的内积.见如下Python代码 ...

最新文章

  1. 【SICP练习】38 练习1.43
  2. c程序封装linux,Linux系统使用C语言封装线程读写锁
  3. 接上,进一步优化,LruCache缓存
  4. 杭电1260java实现
  5. 模拟课----需求文本
  6. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)
  7. iOS7新特性的兼容性处理方法 之三
  8. 【Oracle】DG中物理备库、快照备库的相互转换
  9. HTML 标签的 target 属性
  10. CSDN账号登录异常,一个网址帮你找回账号
  11. 固态硬盘故障检测_diskgenius检测固态硬盘(ssd固态硬盘坏道修复)
  12. python词频统计中文_Python中文词频统计
  13. Mac教程/迅雷mac版精简教程
  14. unity屏幕后处理效果
  15. 2022管理类联考真题不含答案-文都管联院
  16. JS项目获取pc mac地址
  17. 抖音seo源码,抖音短视频SEO,SEO系统源码搭建
  18. 编辑混合变形变形器(Blend Shape)
  19. 【翻译】听觉刺激增强深度睡眠,实现“熟睡自由”
  20. 传智播客成都java培训中心7月8号基础班开班啦

热门文章

  1. 黑马程序员14套经典IT教程+面试宝典
  2. 各大开源项目中的GA的意思?
  3. java swing choice_Java-GUI基础(三)java.swing
  4. 现钞和现汇有什么区别??
  5. 前端实现在线预览文档(pdf、doc文件)
  6. 5.小程序的Ajax数据请求
  7. BEC listen and translation exercise 39
  8. 思科交换机的基础操作命令有这些!
  9. 最新电脑cpu性能排行服务器,服务器cpu性能排行,教您服务器cpu性能排行
  10. flutter 屏幕截图,超出屏幕部分截图