查找算法——插值查找
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.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...
- 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找
第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...
- 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现
文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...
- 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...
- 【数据结构与算法】比较法分析查找算法与查找结构
基本的查找技术: 线性表的查找技术 顺序查找 分块查找 二分查找(折半查找) 插值查找 树表的查找技术 二叉排序树 平衡二叉树 B树(B+树.B-树等) 散列表的查找技术 开散列表 闭散列表 顺序查找 ...
- 查找(顺序查找、二分查找、插值查找)
查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删 ...
- 数据结构与算法 | 插值查找
折半查找法:https://blog.csdn.net/qq_35423154/article/details/101383518 当我们在使用折半查找法的时候,都会有个疑问,为什么一定要用折半,为什 ...
- 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)
1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...
- 数据结构与算法笔记(十二)—— 查找算法(顺序查找、二分法查找)
搜索是在一个项目集合中找到一个特定项目的算法过程.搜索通常的答案是真的或假的,因为该项目是否存在.搜索的几种常见方法:顺序查找.二分法查找.二叉树查找.哈希查找 一.顺序查找 最基本的查找技术,过程: ...
- php折半查找算法,二分查找 [折半查找] 算法 PHP 版
查找表:就是同一类型的数据元素构成的数据集合 有静态表和动态表 本文实现PHP版的二分查找算法[本算法仅用于顺序存储的查找表] /** * Created by PhpStorm. * User: 1 ...
最新文章
- windows下配置java环境jdk
- Windows Azure Platform Introduction (6) Windows Azure应用程序运行环境
- 区块链开发公司能做什么?对企业未来市场有何帮助?
- Linux2.6内核--内存管理(2)--区
- “东数西算”工程正式启动,全面解读来了!
- pat 乙级 1029 旧键盘(C++)
- [转载] Python3.X之——卷积计算
- Java编程基础 - 泛型
- 试炼之石:Performance
- 等保2.0三级安全要求
- pr中如何自定义序列尺寸
- 【读后感】薛兆丰经济学讲义
- single crop和muti-crop
- [16-8-1]每日总结
- 任天堂FC专题 (现在还有没有人对FC感兴趣? 红白机游戏汉化)
- 亿图图示----流程图模块---样例展示
- dell服务器设置CPU高性能,DellR720服务器提示cpu1 internal error (IERR)
- Linux ping www.baidu.com 不通解决办法
- python c++情侣网名是什么意思_“果然,他用的是情侣网名!”
- hot_standby
热门文章
- c#简易学生信息管理系统
- 测试 JavaScript 函数的性能
- 前端文档汇总(觉得对您有用的话,别忘了给点个赞哦 ^_^ !) 1
- 2013年云计算发展展望:混合云即将起飞
- 汇编---3---物理地址
- 【Cocoa(mac) Application 开发系列之二】总结一些常用控件及自定义View
- XFBAY学习笔记=++=实验十三 交换机和路由器组合实验
- CLISP语言中的哈希表
- CTO 说,再用错@Autowired 和@Resource 就可以领盒饭了
- Java 正则表达式处理复杂文本,效率就是高!