当前课程知识点:数据结构(上) > 第二章 向量(下) > (d3)有序向量:Fibonacci查找 > 02D3-3 实例
实际上通过精确地估算
我们确实可以认定
fibonacci查找算法的平均查找长度
在常系数的意义上
的确优于此前的二分查找版本A
关于这方面的结论
可以详细地参见我们的教材以及习题解析
在这里呢 我们只想通过
一个具体的实例来给出分析
依然以上一节
所采用的那个长度为7的向量为例
非常巧
7恰好也是一个形如fibonacci数
减1的这么样一个长度
具体来讲 就是第6项
fibonacci数 也就是8再减掉一个1
我们可以来看一下
对于这样的一个向量
如果采用fibonacci算法的话
所有的搜索可能的情况
如果画成一个最终图
是这样
第一次比对 是在这个元素的位置上
注意 这大致是一个黄金切分点
而不是终点
但是尽管位置不同
正向我们前面所看到的代码一样
在后面的分支逻辑是完全一样的
具体来说
如果我们在第一次比较成功
那么我们就可以确定向左
如果我们经过第二次比较才成功
那么才可以向右
而只有当两次比较都失败
我们才会在当前的那个位置上终止
所以同样刚才我们说的那个道理
每次我们向左的成本都是1
而向右的成本都是2
那么以下也是类似
我们可以采用此前一样的方法
来具体地给出
每一种情况所对应的查找的成本
也就是查找的次数
分别可以标定于此
对于这个元素来说
如果是成功在这个位置的话
对应的是两次
这也是一种成功的情况
这种成功的情况
不出我们的意料 应该总共有7种
成功的情况
而它们各自对应的查找的长度
都列在这儿
所以我们如果做一个总和的考虑
所有这7种情况所对应的查找长度
把它们累加起来 再除以这个7
恰巧是4
如果大家还回想的起来
此前的二分查找对应的数是4.14
略微有所优化
当然我们也可以
把失败的情况用同样的方式累积起来
那么不出意外
应该总共8种失败的情况
我们将它们所有的罗列在这儿
并且做一个累加 就会发现
这个数从原来的36优化成了35
同样这个结果
也要比原来的4.50略低
当然更大的例子
我们可以看得更一般一些
我们把这类工作
留给大家在课后进一步地完成
那么这样一个例子还不足以说明问题
我们接下来要给出一个相对严格地证明
说明为什么在此类查找中
bonacci查找才是最好的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验