当前课程知识点:数据结构(上) > 第二章 向量(上) > (d2)有序向量:二分查找 > 02D2-6 实例
来看几个具体的实例
首先关注左侧这个实例
查找的目标是8
注意这里,我们不妨取整个这个区段
也就是lo等于0,hi等于7
那么在第一次比对
将取出mi等于0和7之间的中点
通过取下整,应该对应的是
秩为3的那个元素,也就是7
第一次比较是看e,也就是8
是否是小于7
我们说是不对的
所以我会继续地转入else if
再来进行第二次判断
也就是,8是否大于7
或者按照我们刚才所说的习惯
7是否小于8
我们说,第二次判断以后才正确
确实是7小于8
换而言之,我们的目标
应该处于这个mi这个点的右侧
注意为此,我们总共进行了两次比较
那么接下来呢
我们要把lo修改为
指向4,hi保持不变,还是7
所以接下来的中点
应该是4加7,整除2,取下整
所以应该是mi取5
所以这就是为什么
对应的下一次比对的对象
那个mi,A[mi]是9
好,同样我们来做第一次比较
也就是e8,是否小于mi,9
我们说确实如此
所以经过一次比对
我们就可以进一步地将注意力
集中到当前这个mi,也就是9的左侧
相应地,要移动右侧的界桩
也就是将原来的lo保持下来
右侧的界桩变为是5
好,再下一步取的mi
应该是5和4相加以后除2的下整
也就是4
所以对应的是这个元素
好,在这个位置上,我们首先来判断
8是否小于8
我们说肯定不是
接下来else if
反过来,这个8是否小于这个8
我们说也是失败
所以我们接下来就可以
else of else,马上可以断定
我们在这个位置成功的匹配
需要注意的是
在这个地方,我们将8和8
做了互相对称的两个方向的,两次比较
所以累计而言,我们总共做了五次比较
才最终在第四个元素这个位置上命中
我们再来看另一个
也就是失败的情况
同样在一个有序向量中,我们去查找
只不过这次的对象是3
也跟刚才一样,第一个mi
是秩为3的这个元素
通过一次比较发现
目标元素3是小于7的
所以我们深入到左侧
具体来说,也就是lo保持不变
hi转移到3这个位置上
接下来呢,再来取新的mi
也就是0加3除2下整
也就是1号这个元素
确切地讲就是4
同样地,3和4
经过一次比较以后,因为比它小
所以我们继续移动右侧的界桩
左侧的界桩继续保持不动
再接下来呢
又要将3,来看是否它小于2
我们说是不对的
接下来,要倒过来看
2是否小于3,这个时候才成立的
所以收缩到一个更小的区间
实际上,已经是非法的区间
我们要把这个lo
也就是左界桩
移动到这个mi的右侧
其实lo和hi,这个时候都等于1
这个区间,如果是显式地写出来的话
就是[1,1)
我们说,实际上它等于空
对于空区间而言
那么当然任何查找都是必然失败的
所以这个时候我们也
那个while循环会退出
最终返回值是-1,表示失败
同样,注意的是,在我们整个这个过程中
第一次比较需要的是一次
第二轮是需要一次
最后一轮,实际上是做了两次
所以累计是四次
最后,在1这个位置上失败
归纳一下
无论如何,我们在while循环的每一次迭代中
有的时候执行一次比较就够了
有的时候执行两次
但是无论如何,最多执行两次
也就是常数次
所以换而言之
每当我们经过常数次比较之后
都可以将原先的问题规模
有效地降解为此前的一半
这样一个递推式,我们进行求解的话
就可以得到
logn的这样的一个最后的
大O的渐近复杂度
你也可以从某种意义上来理解
我们说,这个n,如果从数字的位数来看
它的总体的位数就是logn
二进制展开的位数就是logn
而我们每一次对它进行降解
你可以认为是在原来的基础上
每次都减个1
所以减到什么时候呢?
减到最终当然是0的时候
所以在此期间总共执行了多少层递归呢?
我们说确实就是与这个n
最开始的数位是相当的
从这里也可以简明地来解释这一点
无论如何
相对于此前我们的find的操作
也就是那个顺序的那样的一个查找操作
我们讲过,它的复杂度平均和最坏都是O(n)而言
要大大地改进
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验