当前课程知识点:数据结构(上) > 第二章 向量(下) > (d4)有序向量:二分查找(改进) > 02D4-1 构思
欢迎同学们回来
我们这一节继续讨论有序向量查找算法的改进
回顾上节,我们所介绍的fibonaccian search
实际上,它的改进思路是在注意到
我们查找的过程中的每一步
向左和向右深入的成本是不一样的
具体来说,左边是1的话,右边就是2
所以它试图做这样一个改进
使得整个搜索的倾向
更加地偏向于成本更低的左侧
而使得向右的分支,出现的概率更低
这样的话,我们也严格证明了
在总体情况下
它的查找性能将会得到改进
甚至从一般的意义上讲,已经是最优的了
那么我们这一节呢
将给大家介绍另一种思路的改进
这是一种直截了当的改进思路
既然我们已经注意到了
此前的版本A中
造成效率略低的原因是因为
左右分支的转向代价不平衡
那么我们为什么
就不能够将二者做成是平衡的呢?
也就是说,如果在任何一个位置
我们需要向左和向右的话
我们希望能够使得无论是向左还是向右
只需要进行一次比较
没错,一次比较
当然这样的话,我们每一次迭代中
经过一次比较之后
就只能有两个分支而不是像以前一样
实际上是三个
也就是说,原来隐藏了一个分支
那么原来版本A隐藏的是哪个分支呢?
大家应该能想得到
也就是在当前这个轴点处
命中的那个分支
我们说这个分支,某种意义上讲是
更好甚至是最好的情况
因为在这个时候,我们就可以直接返回了
而在我们采用了新的这样一个改进思路以后
为了获得在每一处的平衡
我们不得不在这个位置上做出一点牺牲
具体来说,我们同样地还是以
中点mi作为轴点
只不过呢,只进行一次判断
也就是我们只判断
我们的目标关键码是否是
严格地小于当前的轴点
如果它确实是小于轴点
那么我们就向左侧区间深入
反过来,如果刚才那句判断答案是否
也就是说,e是大于等于当前的这个轴点x
那么我们就可以断定
它如果存在的话
必然位于右侧的子区间
同样可以进行递归地深入
大家注意,这里头的细微区别
虽然我们这里依然用左和右来区分
两种减而治之的可能和方向
而且左侧的也确实和以前的没有任何区别
但是右侧这个分支所对应的子向量
却略有区别
这个区别就在于
它将这个轴点同时也涵盖进去了
换而言之,正像我们刚才所说的
在这个时候,必须做出一个牺牲
也就是说,我们不能够及时地判定
在当前这个位置已经命中
正如我们马上就要看到的
新的这个算法必须等到整个这个区间
经过足够多次减而治之
最后的区间宽度变成1的时候
才会真正地去判断
当前唯一的这个元素是否是真正命中的
这也就是新的这个算法和此前的算法
在策略上的不同
但是无论如何,这确实是可行的
因为它已经使得我们在任何一个细微处
都能够做到理想的平衡
所以从而使得整个问题更加地简化
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验