当前课程知识点:数据结构(上) > 第二章 向量(上) > (a)接口与实现 > 02A-3 接口操作实例
为获得向量ADT操作的
具体感受
不妨来看 这样一个具体的实例
最开始向量与
任何一个数据结构一样
初始化的时候
都是不包含
任何实质的内容的
我们称它是一个空的向量
那么接下来呢
如果我们调用
插入操作insert
然后这个意思是说
在rank为0的这个位置上
插入一个元素9
所以我们就会看到
向量的组成
将由空变成包含一个元素
也就是这个9
接下来我们继续
调用insert接口
在0号这个位置上
rank为0的这个位置上
插入一个元素4
所以4会插入在这
而原来的元素呢
比如说这个地方只有9呢
原来的元素呢 将会后移一位
同样地 我们也可以
调用插入接口
在rank为1的位置上插入5
这就是为什么
在这个位置上出现了5
而它的后继统一地
向后后移了一位
我们也可以调用put接口
这个接口的意思是修改
它会把当前
rank为1的那个位置上的元素
数值 由原来的5修改为2
我们也可以通过get这个接口
获取秩为某一特定值的元素
比如说 秩为2的那个元素
实际上就是
0 1 2这个位置上的9
我们看到这是第一次
我们有了一个
output 有一个输出
当然还包括其它的
比如说insert insert
包括remove
这是我们需要重点看一下的
我们说remove
这个接口的参数是2
这说明 它希望在原来这个向量中
将rank为0 1 2的这个元素
恰好它的数值也是2
把它剔除掉
所以剔除之后
会把这个被剔除的元素
作为输出 返回回来
同时它的所有的后继
与插入时候的操作的现象相反
会向前平移一个单元
包括其它的insert insert
当这个时候我们调用
size的时候
因为这里所包含的元素总共是6个
所以它返回6就不奇怪了
我们可以看到在整个
这个操作的过程中
向量都确实具有这么样一个特点
就是它在逻辑上
甚至在物理上
必然是彼此紧邻的排列的
所有的元素之间
没有任何的缝隙
接下来我们可以通过
disordered()这个接口
来检测这个向量的有序性
或者更准确地讲 它的无序性
我们在此前介绍bubble sort
算法的原理的时候
曾经指出
包括向量在内的序列
是否有序
当且仅当其中
是否存在紧邻的逆序对
那么这里总共有6个元素
共定义了5组紧邻对
其中有3组
也就是4和3
7和4、和9和6是逆序的
所以这就是为什么
它返回的是3
只要这个数值不是0
就说明它尚未构成有序的序列
好 对于这样的一个无序的向量
我们已经可以通过find接口
来查找其中特定的某个元素
比如说9
你可以看到9号元素
是位于rank为
0 1 2 3 4的位置
所以这就是为什么
我们这里需要返回是4
同样地 也可以查找
下一个比如说5
我们一眼扫去就会发现
5并不存在
这个时候
我们统一地约定
返回一个数值 是-1
这个-1肯定不是
一个合法的rank
表示查找失败
好 再接下来
我们可以通过sort这个接口
对整个向量排序
大家注意 无论是此前
所介绍的这些接口
还是后面我们要所介绍的接口
就目前而言
我们并不关心它的具体实现方法
我们关心的只是它的操作语义
这就犹如刚才所说地
这些规范其实就相当于
一个冰箱的使用说明
或者一辆汽车的驾驶规范
我们并不需要
现在就了解它的实现细节
我们只需要了解它的功能
所以从功能上讲
这个排序确实可以做到这一点
接下来再调用
disordered()这个接口
它已经没有任何逆序的紧邻对了
所以返回0
对于有序向量
我们可以通过另一套接口
也就是search来进行查找
比如说 可以首先通过search
然后引用9来查找
数值为9的元素
这个元素的rank为
0 1 2 3 4 5
所以这就是为什么
这里返回的是5
那么如果查找8会怎么样呢?
一眼望去 这里并没有8
当然我们简便的方法
是直接返回-1
但是我们后面会讲到
这种方法并不好
实际上 这里我们采用了另一种约定
比如说 对这个例子来讲
我们返回的是4
为什么是4呢?
因为我们这里约定
如果没有找到这个元素
我们要找的是不超过这个元素的
最大的那个元素的值
对这个例子而言
不超过8的最大的元素
实际上就是7
而这个7的秩是多少呢?
就是0 1 2 3 4
所以这是为什么返回的是4
同样 我们如果要去查找10的话
会返回不超过10的
最大的那个元素
也就是9的秩 也就是5
另一种特殊情况
就是我们查找一个全局都没有
而且小于全局的最小的
那个元素的数
比如说1 后面我们会讲到
我们会假设在这个-1的
rank这个位置上
有一个假想的哨兵
它的数值是负无穷
所以这里返回的
应该是在整体这些元素中
不大于1的
其实就只有那个
负无穷 那个元素的rank
也就是-1
这样一套约定
可以使得我们在语义上
更加的明确
使得我们在后续的操作过程中
可以便利地来搭建不同的算法
当然 还有一点
在有些时候
我们要查找的元素尽管有
但是它反过来却有很多次出现
比如说这个4 出现了两次
那这个时候我应该返回谁呢?
同样跟我们这里的语义
所定义吻合的是
我们要返回其中不超过4
这个目标元素的
最后边那个元素
所以如果有两个甚至多个的话
我们会取其中rank最大的那个元素
并且把它的rank给返回回来
对这个例子而言 也就是
0 1 2 2号元素
那么这种语义为什么要这么定义
需要在后边讲到相应的算法的时候
再去细细体会
最后 看一下这个uniquify()
对于一个有序的向量
我们在其中
把所有的重复的元素
比如说4都剔出掉
只保留一个拷贝
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验