当前课程知识点:数据结构(上) > 第二章 向量(下) > (d4)有序向量:二分查找(改进) > 02D4-3 语义
实际上无论是
我们此前所给的binary search的两个版本
还是fibonaccian search
它们如果从严格的意义上讲
都没有真正地兑现我们在此前
针对search()接口所做的语义约定
大家应该还记得
我们当时做过严格地语义约定
无论成功或者失败
search()接口的返回值
必须是在整个有效区间内
不大于我们的目标e的
最后的那个元素
我们在此之前甚至讲过这种约定的必要性
因为只有做过这样的约定之后
我们才能够支持一些相关的算法
比如说最简单的,是有些向量自身的维护
我们经常需要插入一个元素
并且使得在插入之后
向量的有序性得到延续
为此的话,我们就需要在查找的时候
不光要报告我们成功与否
更重要的是在于,它返回一个确定的位置
而这个位置
再加上1
或者就做一个简单地调整之后
就可以作为我们新元素合适的插入位置
所以即便是就这个小问题而言
我们也要求至少要满足以下这样几点
第一,如果是有多个元素同时存在的话
我们曾经讲过它们
必然会在整个这个区间里头
构成一个连续的子区段
彼此紧密地排列
我们必须要返回其中最靠后
也就是说从秩的意义上讲,最大的那个元素
这样的话,我们新的同样这个意义的元素
再通过在这个位置加1以后
就可以顺利地插入在紧随其后的这个位置
另外呢,在失败的时候
刚才这个语义也可以等效地转义为
返回小于这个目标元素的最大值
因为这里头不可能有等于
所以不大于其实就是小于
当然这里包含一个特殊情况
就是有可能这个返回值是哨兵
哪个哨兵呢?
就是在有效区间段
最左侧的这个lo的左侧
我们可以假想地在这里引入一个哨兵
我们曾经讲过,它的数值可以认为是负无穷
因此呢,充其量只能到它这儿
而在这个时候
我们说其实如果真是这样
要插入这么一个元素
而且搜索完之后停留在这儿
返回的位置是lo-1的这个位置的话
那只能说明这个新的元素e
必然是全局现在已有的元素中最小
所以如果是返回这个的话
是再恰当不过了
我们可以把它作为最小的那个元素插入
而这个位置到这儿也是一个加1的过程
在刚才版本B的基础上
我们可以进一步地略做调整
得到最终的一个版本,也就是版本C
而这个版本确实可以严格地实现
我们刚才所要求的语义
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验