二十二、插值查找算法
一、插值算法的介绍
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
四、注意事项
对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.
关键字分布不均匀的情况下,该方法不一定比折半查找要好
二十二、插值查找算法相关推荐
- 数字图像处理领域的二十四个典型算法及vc实现、第一章
数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July 二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...
- 数字图像处理领域的二十四个典型算法
数字图像处理领域的二十四个典型算法及vc实现.第一章 一.256色转灰度图 二.Walsh变换 三.二值化变换 四.阈值变换 五.傅立叶变换 六.离散余弦变换 数字图像处理领域的二十四个典型算法及vc ...
- OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()
OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- 程序员编程艺术第一 二十二章集锦与总结(教你如何编程)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员编 ...
- 程序员编程艺术第一~二十二章集锦与总结(教你如何编程)
程序员编程艺术第一~二十二章集锦与总结(教你如何编程) 作者:July.编程艺术室. 出处:http://blog.csdn.net/v_JULY_v . 题记 好久没更新博客了,虽只有一个月,但对我 ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
- (原创)无废话C#设计模式之二十二:总结(针对GOF23)
无废话C#设计模式之二十二:总结(针对GOF23) 比较 设计模式 常用程度 适用层次 引入时机 结构复杂度 Abstract Factory 比较常用 应用级 设计时 比较复杂 Builder 一般 ...
- FreeSql (二十二)Dto 映射查询
适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...
最新文章
- 高性能存储之--快速理解redis(简版)
- Django常用模板标签
- Dubbo-入门指南+实例
- 如何让以特定字符串结尾的所有站点都被加入到Local Intranet Zone中?
- Python入门学习之异常处理机制
- MXRuntimeUtils,替代 [NSObject performSelector object object ]的工具
- Java语言String字符串课后作业
- 火了!杭州程序员自编“购房宝典”,点击超40万,业内人士惊呆
- iptables基本用法和linux网络相关
- 【推荐】数据科学中的非数学特征提取方法
- 中学计算机课程课时,高中信息技术课程教学计划
- iphone6 计算机无法检测到照相机,爱思助手无法识别设备怎么办 爱思助手无法识别设备解决方法...
- 时差怎么理解_英国与中国的时差为什么隔8小时(英国与中国的时差解读)
- 学习TypeScript
- couch base使用记录
- 【数学分析入门】R语言独立性检验方法
- python 正数变成负数_初一数学上册第一章有理数1.1正数和负数基础知识概括及同步练习题含解析...
- 计算机网络自顶向下方法(二)——应用层
- STM32遥控小车下位机及硬件连接部分(Keil MDK5平台的C++编程)
- E2UART编程(β板实操)task1传输helloworld