博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
查找算法——插值查找
阅读量:2339 次
发布时间:2019-05-10

本文共 1757 字,大约阅读时间需要 5 分钟。

查找算法——插值查找

  1. 基本介绍:插入算法是采用了自适应mid的二分查找,更加快速
  2. 原理介绍:将二分查找中求mid索引的公式变成:mid = left + (key -arr[left]) / (arr[right] - arr[left]) * (right - left),其中key为所需要查找的值。将key待查找值与总长度作比较,然后转化成对应的索引长度。
  3. 弥补二分查找的缺陷:当用二分法查找一组有序数列的初始值时,会通过多次递归,必须将索引递归到底。但是插值查找会根据所要查找的数字的值相对于整个有序数组所在的区间索引所在的位置确定他的索引。
  4. 代码实现:
package insertsearch;import java.util.ArrayList;import java.util.List;public class InsertSearch {
public static void main(String[] args) {
int[] arr = {
1, 4, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19}; System.out.println(insertSearch(arr, 0, arr.length - 1, 0)); } public static List
insertSearch(int[] arr, int left, int right, int searchVal) {
int mid = left + (searchVal - arr[left]) / (arr[right] - arr[left]) * (right - left); if (left > right || searchVal > arr[right - 1] || searchVal < arr[left]) {
return new ArrayList
(); } if (arr[mid] < searchVal) {
return insertSearch(arr, mid + 1, right, searchVal); } else if (arr[mid] > searchVal) {
return insertSearch(arr, left, mid - 1, searchVal); } else {
List
list = new ArrayList<>(); int temp = mid - 1; while (arr[temp] == arr[mid] && temp >= 0) {
list.add(temp); temp--; } list.add(mid); temp = mid + 1; while (arr[temp] == arr[mid] && temp <= right) {
list.add(temp); temp++; } return list; } }}

分析与总结:

  1. 对于不在有序序列之内的数字,比如比最小值还小的数,会出现mid<0的情况,所以提前排除这种情况。首先对所需要搜索的数字进行判断,是否在对应的区间之内。
  2. 在折中算法的基础上加上自适应mid确实能够有效改善算法本身
  3. 注意:
  • 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找速度比较快
  • 关键字分布不均匀就是情况而定了

转载地址:http://yqgpb.baihongyu.com/

你可能感兴趣的文章
使用软件虚拟串口
查看>>
MSComm 控件
查看>>
在VC6.0及VS中添加对话框oninitdialog()函数的方法
查看>>
用控件(CMSComm)串口调试问题的解决
查看>>
Windows CE下的串口通信编程
查看>>
串口通信学习(发送)
查看>>
全面剖析《自己动手写操作系统》的pmtest1.asm
查看>>
寻址方式介绍
查看>>
自己动手写操作系统--个人实践
查看>>
安装Gvim及问题解决
查看>>
SIM300-E GPRS模块硬件
查看>>
cadence16.3安装问题解决(解决最后的license的问题)
查看>>
什麽是世界上最值得珍惜的
查看>>
西门子TC35模块开发知识
查看>>
数组与指针的区别
查看>>
船模制作基础大全
查看>>
linux内核手动配置学习
查看>>
linux下C编程风格点滴
查看>>
linux下内核模块编译初阶
查看>>
linux内核模块传参
查看>>