1、算法介绍

插值查找是对二分查找的优化,是有序序列的查找算法。

二分查找:mid = (left + right)/2 = left/2 + right/2 = left - left/2 + right/2

         = left + (right - left)/2 = left + (right - left) * (1/2)

二分查找选取中间位置,插值查找则通过查找值判定大概位于序列的哪个位置比例。

插入查找:选择下标 = left + (right - left) * (key - arr[left])/(arr[right] - arr[left])

(1)序列为有序序列

(2)根据公式选取比较值,相等返回下标,不相等则根据公式继续查找,未找到返回-1

2、代码实现

2.1、golang

package mainimport ("fmt"
)func main() {slice := []int{1, 2, 3, 4, 5, 6} //升序序列key := -100index := SearchInsert(slice, key)if index == -1 {fmt.Printf("%v不存在元素%v\n", slice, key)} else {fmt.Printf("%v位于%v下标为%v的位置。\n", key, slice, index)}
}//插值查找
func SearchInsert(slice []int, key int) int {left, right := 0, len(slice)-1for left <= right {//相等值处理if slice[right] == slice[left] {if slice[left] == key {return left}return -1}mid := left + (right-left)*(key-slice[left])/(slice[right]-slice[left])//下标判断if mid < left || key > right {return -1}if slice[mid] == key {return mid}if slice[mid] > key {right = mid - 1}if slice[mid] < key {left = mid + 1}}return -1
}

2.2、python3

# 插值查找
def search_insert(arr, key):left, right = 0, len(arr) - 1while (left <= right):# 相等判断if arr[right] == arr[left]:if arr[left] == key:return leftelse:return -1mid = left + (key - arr[left]) // (arr[right] - arr[left]) * (right -left)# 选取下标判断if mid < left or mid > right:return -1if (arr[mid] == key):return midif (arr[mid] > key):right = mid - 1if (arr[mid] < key):left = mid + 1return -1if __name__ == '__main__':arr = [2, 2, 2, 2]key = 2index = search_insert(arr, key)if index == -1:print("%s不存在元素%s。" % (arr, key))else:print("%s位于%s下标为%s的位置。" % (key, arr, index))

  

转载于:https://www.cnblogs.com/dzhy/p/10948280.html

查找算法——插值查找相关推荐

  1. 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)

    查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...

  2. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

  3. 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现

    文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...

  4. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  5. 【数据结构与算法】比较法分析查找算法与查找结构

    基本的查找技术: 线性表的查找技术 顺序查找 分块查找 二分查找(折半查找) 插值查找 树表的查找技术 二叉排序树 平衡二叉树 B树(B+树.B-树等) 散列表的查找技术 开散列表 闭散列表 顺序查找 ...

  6. 查找(顺序查找、二分查找、插值查找)

    查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删 ...

  7. 数据结构与算法 | 插值查找

    折半查找法:https://blog.csdn.net/qq_35423154/article/details/101383518 当我们在使用折半查找法的时候,都会有个疑问,为什么一定要用折半,为什 ...

  8. 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)

    1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...

  9. 数据结构与算法笔记(十二)—— 查找算法(顺序查找、二分法查找)

    搜索是在一个项目集合中找到一个特定项目的算法过程.搜索通常的答案是真的或假的,因为该项目是否存在.搜索的几种常见方法:顺序查找.二分法查找.二叉树查找.哈希查找 一.顺序查找 最基本的查找技术,过程: ...

  10. php折半查找算法,二分查找 [折半查找] 算法 PHP 版

    查找表:就是同一类型的数据元素构成的数据集合 有静态表和动态表 本文实现PHP版的二分查找算法[本算法仅用于顺序存储的查找表] /** * Created by PhpStorm. * User: 1 ...

最新文章

  1. windows下配置java环境jdk
  2. Windows Azure Platform Introduction (6) Windows Azure应用程序运行环境
  3. 区块链开发公司能做什么?对企业未来市场有何帮助?
  4. Linux2.6内核--内存管理(2)--区
  5. “东数西算”工程正式启动,全面解读来了!
  6. pat 乙级 1029 旧键盘(C++)
  7. [转载] Python3.X之——卷积计算
  8. Java编程基础 - 泛型
  9. 试炼之石:Performance
  10. 等保2.0三级安全要求
  11. pr中如何自定义序列尺寸
  12. 【读后感】薛兆丰经济学讲义
  13. single crop和muti-crop
  14. [16-8-1]每日总结
  15. 任天堂FC专题 (现在还有没有人对FC感兴趣? 红白机游戏汉化)
  16. 亿图图示----流程图模块---样例展示
  17. dell服务器设置CPU高性能,DellR720服务器提示cpu1 internal error (IERR)
  18. Linux ping www.baidu.com 不通解决办法
  19. python c++情侣网名是什么意思_“果然,他用的是情侣网名!”
  20. hot_standby

热门文章

  1. c#简易学生信息管理系统
  2. 测试 JavaScript 函数的性能
  3. 前端文档汇总(觉得对您有用的话,别忘了给点个赞哦 ^_^ !) 1
  4. 2013年云计算发展展望:混合云即将起飞
  5. 汇编---3---物理地址
  6. 【Cocoa(mac) Application 开发系列之二】总结一些常用控件及自定义View
  7. XFBAY学习笔记=++=实验十三 交换机和路由器组合实验
  8. CLISP语言中的哈希表
  9. CTO 说,再用错@Autowired 和@Resource 就可以领盒饭了
  10. Java 正则表达式处理复杂文本,效率就是高!