一、插值算法的介绍

1)插值算法原理介绍

插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。

2)将折半查找中的求 mid 索引的公式 , low 表示左边索引 left, high 表示右边索引 right. key 就是要查找的值

3)int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/

对应前面的代码公式: int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

4)举例说明插值查找算法 1-100 的数组

二、代码实现

package cn.zzw.algorithm.search;public class InsertValueSearch {public static void main(String[] args) {int[] arr=new int[100];for(int i=0;i<100;i++){arr[i]=i+1;}int index=insertValueSearch(arr,0,arr.length-1,1);System.out.println("index="+index);}/**** @param arr* @param left  左边索引* @param right  右边索引* @param findVal  查找值* @return*/public static int insertValueSearch(int[] arr,int left,int right,int findVal){int count=0;System.out.println("插值查找的次数~"+(++count));//注意findVal<arr[0] ||findVal>arr[arr.length]这个判断条件是一定要写的//否则我们得到的mid可能越界if(left>right || findVal<arr[0] || findVal>arr[arr.length-1]){return -1;}int mid=left+(right-left)*(findVal-arr[left])/(arr[right]-arr[left]);int midValue=arr[mid];if (findVal>midValue){//向右递归return insertValueSearch(arr,mid+1,right,findVal);}else if (findVal<midValue){//向左递归return insertValueSearch(arr,left,mid-1,findVal);}else{return mid;}}
}

测试结果:

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=29593:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.search.InsertValueSearch
插值查找的次数~1
index=0Process finished with exit code 0

四、注意事项

  1. 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.

  2. 关键字分布不均匀的情况下,该方法不一定比折半查找要好

二十二、插值查找算法相关推荐

  1. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

  2. 数字图像处理领域的二十四个典型算法

    数字图像处理领域的二十四个典型算法及vc实现.第一章 一.256色转灰度图 二.Walsh变换 三.二值化变换 四.阈值变换 五.傅立叶变换 六.离散余弦变换 数字图像处理领域的二十四个典型算法及vc ...

  3. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  4. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  5. 程序员编程艺术第一 二十二章集锦与总结(教你如何编程)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员编 ...

  6. 程序员编程艺术第一~二十二章集锦与总结(教你如何编程)

    程序员编程艺术第一~二十二章集锦与总结(教你如何编程) 作者:July.编程艺术室. 出处:http://blog.csdn.net/v_JULY_v . 题记 好久没更新博客了,虽只有一个月,但对我 ...

  7. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  8. (原创)无废话C#设计模式之二十二:总结(针对GOF23)

    无废话C#设计模式之二十二:总结(针对GOF23) 比较 设计模式 常用程度 适用层次 引入时机 结构复杂度 Abstract Factory 比较常用 应用级 设计时 比较复杂 Builder 一般 ...

  9. FreeSql (二十二)Dto 映射查询

    适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...

最新文章

  1. 高性能存储之--快速理解redis(简版)
  2. Django常用模板标签
  3. Dubbo-入门指南+实例
  4. 如何让以特定字符串结尾的所有站点都被加入到Local Intranet Zone中?
  5. Python入门学习之异常处理机制
  6. MXRuntimeUtils,替代 [NSObject performSelector object object ]的工具
  7. Java语言String字符串课后作业
  8. 火了!杭州程序员自编“购房宝典”,点击超40万,业内人士惊呆
  9. iptables基本用法和linux网络相关
  10. 【推荐】数据科学中的非数学特征提取方法
  11. 中学计算机课程课时,高中信息技术课程教学计划
  12. iphone6 计算机无法检测到照相机,爱思助手无法识别设备怎么办 爱思助手无法识别设备解决方法...
  13. 时差怎么理解_英国与中国的时差为什么隔8小时(英国与中国的时差解读)
  14. 学习TypeScript
  15. couch base使用记录
  16. 【数学分析入门】R语言独立性检验方法
  17. python 正数变成负数_初一数学上册第一章有理数1.1正数和负数基础知识概括及同步练习题含解析...
  18. 计算机网络自顶向下方法(二)——应用层
  19. STM32遥控小车下位机及硬件连接部分(Keil MDK5平台的C++编程)
  20. E2UART编程(β板实操)task1传输helloworld

热门文章

  1. 图像处理包括哪些东东?
  2. java与fabric区块链--fabric-ca-server 登记---(2)
  3. Scanpy(二)对PBMC3k聚类
  4. 高性能Linux服务器运维实战,《高性能Linux服务器构建实战》笔记
  5. mysql 清空表怎么恢复_mysql怎么恢复删除的表?mysql找回误删表的数据方法
  6. R语言|PLS_DA分析绘图示例
  7. 零基础入门学习Python(19)-内嵌函数和闭包
  8. R包corrplot绘图相关系数矩阵
  9. Maptree-层级结构数据展示的绝佳尝试
  10. ANCOM:找出微生物群落中的差异物种