折半查找、插值查找以及斐波那契查找
来源:互联网 发布:hammer.js中文文档 编辑:程序博客网 时间:2024/06/15 16:36
1. 折半查找
关键公式: mid = (low + high)/2 = low + 1/2(high - low).
其时间复杂度为O(logn),因为n个节点的完全二叉树的深度为[log2n]+1. [X]表示不大于X的最大整数。
2. 插值查找
根据插值法的思想,其本质和折半查找没有区别。
关键公式:mid = low + (high - low)*(key - a[low])/(a[high] - a[low]);
其时间复杂度仍为O(logn),但对于表比较长且分布较均匀的查找表而言,插值查找算法的平均性能高于折半查找。
3. 斐波那契查找
其思想与折半查找、插值查找没有多大区别,本质上只是分割点的选择不同。斐波那契查找需要构造斐波那契数列,该数列的作用就是提供分割点(好多算法书都没有介绍清楚啊!!!)
(1) 算法首先找到构造一个查找表,即在原来的数组上添加元素,使得该查找表(数组)的长度为某个斐波那契值减1,即F(k)-1;
(2) 设置当前的分隔为mid = low + F[k-1] -1. 至于为什么这么设置分割点?我认为是斐波那契数列的特点,即后一项是前两项之和,这前两项正好对应着查找表的左右两部分。可以简单的理解为一种特殊的分割点设置方法;
(3) 当key = a[mid]时,查找成功;当key<a[mid]时,新范围是第low个到第mid-1个,此时范围个数为F[k-1]-1个;当key>a[mid]时,新范围是第m+1个到第high个,此时范围个数为F[k-2]-1个。
(4) 最后将mid与查找表的长度n进行比较,若不大于查找表的长度,则mid为查找到的位置;否则,mid为不全补全数值处的位置。
其时间复杂度仍为O(logn)。
三者查找算法的比较:
折半查找是进行加法与除法运算(mid = (low+high)/2),插值查找进行复杂的四则运算(mid = low + (high - low)*(key - a[low])/(a[high] - a[low])),而斐波那契查找只是简单的加减运算(mid=low+F[k-1]-1)。这三种查找的时间复杂度均为O(logn),不过,根据不同的数据特点来选择查找方法,能够很大程度上提高查找的效率。
- 折半查找、插值查找以及斐波那契查找
- 静态查找(顺序查找,折半查找,插值查找,斐波那契查找)
- 简单查找算法之折半查找、插值查找、斐波那契查找
- 数据结构之查找——折半查找、插值查找、斐波那契查找
- 折半查找、插值查找和斐波那契查找
- 二分查找,插值查找,斐波那契查找
- 查找算法小结:顺序查找、 二分查找、斐波那契查找 、插值查找
- 折半查找&&插值查找
- 数据结构 插值查找 斐波那契查找
- 顺序查找:二分查找,斐波那契查找,插值查找
- 查找(顺序查找、插值查找和斐波那契查找)
- 有序表查找(二分查找,插值查找,斐波那契查找)
- 【查找】二分查找、插值查找、斐波那契查找
- 有序表查找(折半,插值,斐波那契).c
- Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
- 有序向量:二分查找&斐波那契查找&插值查找
- 查找(顺序查找、折半查找、斐波那契查找)
- 数据结构与算法13:折半查找、差值查找和斐波那契查找
- Eclipse下使用git向一个分支同时推送多个项目
- Python-Pandas 学习 合并两个含空缺值列表的其中一个方法
- 动态规划//旧文迁移
- 数据结构之链表常见面试题
- mybatis调用oracle存储过程返回游标 读取到java的List<Map>
- 折半查找、插值查找以及斐波那契查找
- Jsp、servlet、jdbc数据流向网络动态编程
- 过滤html标签,保留指定参数
- 高级软件架构师实战培训阶段一
- Linux常用命令
- 数据库的主从配置 读写分离 中间件之-------Amoeba
- Python+Selenium练习篇之23-组合键-全选文字
- 贪心算法//旧文迁移
- server 内部异常堆栈跟踪的结尾