当前课程知识点:数据结构(上) > 第二章 向量(上) > (c)无序向量 > 02C-6 查找
再来讨论查找操作
也就是说,按照某种特定的条件
从向量中找出特定的元素
那么这里呢,我们需要
澄清两个概念
一个是叫作判等
一个叫作比较
也就是,对于任何的两个元素
我们来判断它们是否是相等
或者是来比较一下
它们之间谁大谁小
这两个操作
并不是所有的类型都天然支持的
所以这里我们做一个假设
或者向量中元素的类型
是基本类型
或者向量元素这个类
已经重载了
对应的判等的操作符
或者是比较的操作符
我们说所谓的无序向量
可以一般性地认为
它只支持判等操作
而对于有序向量
要求要更高一点
它还需要支持其中的元素
能够相互比较大小
无论如何
我们先做这样的一个假设
当然,在我们具体实现对应
元素的类型的时候
也要按照这样的一个假设
来事先做好准备工作
比如说,在我们稍后
会介绍一种统一的
Entry词条这么一类
它本身就是满足这些要求的
在这里呢,我们不妨把它
作为一个假设
无序向量的查找过程
可以描述为这样一幅图
如果查找的区间范围,视野范围
是 lo 到 hi 的话
我们就从 hi 出发
逆向地、逐一地取出
向量中的各个元素
与目标元素进行比对
如果不相等,就忽略它
并且进而考察它的前驱
所以整个的工作会
亦步亦趋地
逐个地遍历向量中的所有的元素
那么经过这样一个
逆向地扫描的过程
我们很有可能在中间的某一步
找到特定的
我们所需要的那个目标
也就是查找成功
如果一直持续到最后
我们在试图越过这个lo
也就这个合法的
最左侧的边界的时候
就可以断定
整个查找是失败的
我们来看一下这样一个算法
如何体现为具体的代码
可以看到,其中最重要的是
这个while循环
如刚才所言,确实它是从hi出发
每次都去通过减减
指向下一个元素
只要这个元素相对于lo
也就是左边的界桩而言,还没有越界
它就是一个当前视野内的
合法元素
我们就将它取出来
并且与目标进行比较
如果不相等,这个循环
会持续地进行下去
循环退出的条件是什么呢?
既然这个地方是and
所以反过来,or,有两种
一种是我们确实在某一个位置
发现了这样的元素
这个叫作成功命中
否则的话呢
还有一种情况
就是一直持续到最后
我们实际上已经越过了
这个 lo 的有效范围
这个时候 hi
经过足够多次减法之后
已经明确地小于了 lo
这个时候也同样需要
返回对应的这个秩
我们提醒大家注意
无论是刚才所说的哪种情况
这里返回的
其实都是最终停止的那个位置
有可能是合法的一个位置
也可能是刚刚越过左边界的
那个非法的位置
无论如何都返回这个位置
而具体判别是否成功呢
我们把这个判断
交给上层的调用者
因为它通过这个秩是否是合法
就可以判断查找是否成功
而且,如果是成功的话
这样一个秩
将可以被高层的算法
进一步地利用
由此,我们也可以看出
这个算法的复杂度
有很大的变化空间
在最好的情况下
可能一进来
在第一个元素位置上
就顺利地命中
所以这个时候呢
复杂度,我们知道
应该叫作常数O(1)
但是在最坏的情况
比如说一直持续到比较后
才发现这个元素
甚至一直持续到最终
也没有发现我们的目标元素
为此在这个过程中
我们需要扫描的元素
可能会与整个
这个向量的规模相当
也就是O(n)
这样一种在最好和最坏情况下
相差极其悬殊的算法
叫作输入敏感的算法
input-sensitive
也就是说
它的复杂度,具体是多少
与输入时候数据的配置
非常非常的相关
紧密的相关
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验