当前课程知识点:数据结构(上) >  第二章 向量(上) >  (a)接口与实现 >  02A-3 接口操作实例

返回《数据结构(上)》慕课在线视频课程列表

02A-3 接口操作实例在线视频

02A-3 接口操作实例

下一节:02A-4 构造与析构

返回《数据结构(上)》慕课在线视频列表

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晋级

--MOOC --> THU 晋级申请专区

--THU --> CST 晋级申请专区

--编程作业不过瘾?且来清华试比高!

第一章 绪论(上)

-(a)计算

--01-A-1: 计算

--01a-2: 绳索计算机

--01a-3: 尺规计算机

--01a-4: 算法

--01a-5 : 有穷性

--演示

--01a-6 : 好算法

--(a)计算--作业

-(b)计算模型

--01b-1: 性能测度

--01b-2: 问题规模

--01b-3: 最坏情况

--01b-4: 理想模型

--01b-5: 图灵机

--01b-6: 图灵机实例

--01b-7: RAM模型

--01b-8: RAM实例

-(b)计算模型--作业

-(c)大O记号

--01c-1: 主流长远

--01c-2: 大O记号

--01c-3: 高效解

--01c-4 : 有效解

--01c-5 : 难解

--01c-6: 2−Subset

--01c-7: 增长速度

-(c)大O记号--作业

第一章 绪论(下)

-(d)算法分析

--01d-1: 算法分析

--01d-2: 级数

--01d-3: 循环

--01d-4: 实例:非极端元素+起泡排序

--01d-5: 正确性的证明

--01d-6: 封底估算-1

--01d-7: 封底估算-2

-(d)算法分析--作业

-(e)迭代与递归

--01-E-1: 迭代与递归

--01-E-2: 减而治之

--01-E-3: 递归跟踪

--01-E-4: 递推方程

--01-E-5: 数组倒置

--01-E-6: 分而治之

--01-E-7: 二分递归:数组求和

--01E-8 二分递归:Max2

--01E-09: Max2:二分递归

-(e)迭代与递归--作业

-(xc)动态规划

--01XC-1: 动态规划

--01XC-2: Fib():递推方程

--01XC-3: Fib():封底估算

--01XC-4: Fib():递归跟踪

--01XC-5: Fib():迭代

--01XC-6: 最长公共子序列

-- 演示

--01XC-7: LCS:递归

--01XC-8: LCS:理解

--01XC-9: LCS:复杂度

--01XC-A: LCS:动态规划

-(xc)动态规划--作业

-本章测验--作业

第二章 向量(上)

-(a)接口与实现

--02A-1 接口与实现

--02A-2 向量ADT

--02A-3 接口操作实例

--02A-4 构造与析构

--02A-5 复制

-(a)接口与实现--作业

-(b)可扩充向量

--02B-1 可扩充向量

--02B-2 动态空间管理

--02B-3 递增式扩容

--02B-4 加倍式扩容

--02B-5 分摊复杂度

-(b)可扩充向量--作业

-(c)无序向量

--02C-1 概述

--02C-2: 循秩访问

--02C-3 插入

--02C-4 区间删除

--02C-5 单元素删除

--02C-6 查找

--02C-7 唯一化

--02C-8 遍历

-(c)无序向量--作业

-(d1)有序向量:唯一化

--02D1-1 有序性

--02D1-2 唯一化(低效版)

--02D1-3 复杂度(低效版)

--02D1-4 唯一化(高效版)

--02D1-5 实例与分析(高效版)

-(d1)有序向量:唯一化--作业

-(d2)有序向量:二分查找

--02D2-1 概述

--02D2-2 接口

--02D2-3 语义

--02D2-4 原理

--02D2-5 实现

--02D2-6 实例

--02D2-7 查找长度

-(d2)有序向量:二分查找--作业

第二章 向量(下)

-(d3)有序向量:Fibonacci查找

--02D3-1 构思

--02D3-2 实现

--02D3-3 实例

--02D3-4 最优性

-(d3)有序向量:Fibonacci查找--作业

-(d4)有序向量:二分查找(改进)

--02D4-1 构思

--02D4-2 版本B

--02D4-3 语义

--02D4-4 版本C

--02D4-5 正确性

-(d4)有序向量:二分查找(改进)--作业

-(d5)有序向量:插值查找

--02D5-1 原理

--02D5-2 实例

--02D5-3 性能分析

--02D5-4 字宽折半

--02D5-5 综合对比

-第二章 向量(下)--(d5)有序向量:插值查找

-(e)起泡排序

--02 E-1 构思

--02E-2 改进

--02E-3 反例

--02E-4 再改进

--02E-5 综合评价

-(e)起泡排序--作业

-(f)归并排序

--02F-1 归并排序:构思

--02F-2 归并排序:主算法

--02F-3 二路归并:实例

--02F-4 二路归并:实现

--02F-5 二路归并:正确性

--02F-6 归并排序:性能分析

-(f)归并排序--作业

-本章测验--作业

第三章 列表

-(a)接口与实现

--03A-1 从静态到动态

--03A-2 从向量到列表

--03A-3 从秩到位置

--03A-4 实现

-(a)接口与实现--作业

-(b)无序列表

--03B-1 循秩访问

--03B-2 查找

--03B-3 插入与复制

--03B-4 删除与析构

--03B-5 唯一化

-(b)无序列表--作业

-(c)有序列表

--03C-1 唯一化·构思

--03C-2 唯一化·实现

--03C-3 查找

-(c)有序列表--作业

-(d)选择排序

--03D-1 构思

--03D-2 实例

--03D-3 实现

--03D-4 推敲

--03D-5 selectMax()

--03D-6 性能

-(d)选择排序--作业

-(e)插入排序

--03E-1 经验

--03E-2 构思

--03E-3 对比

--03E-4 实例

--03E-5 实现

--03E-6 性能分析

--03E-7 平均性能

--03E-8 逆序对

-(e)插入排序--作业

-(xd)习题辅导:LightHouse

--03X D 习题辅导:LightHouse

-本章测验--作业

第四章 栈与队列

- (a)栈接口与实现

--04A-1 栈

--04A-2 实例

--04A-3 实现

- (a)栈接口与实现--作业

-(c1)栈应用:进制转换

--04C1-1 应用

--04C1-2 算法

--04C1-3 实现

-第四章 栈与队列--(c1)栈应用:进制转换

-(c2)栈应用:括号匹配

--04C2-1 实例

--04C2-2 尝试

--04C2-3 构思

--04C2-4 实现

--04C2-5 反思

--04C2-6 拓展

-(c2)栈应用:括号匹配--作业

-(c3)栈应用:栈混洗

--04C3-1 混洗

--04C3-2 计数

--04C3-3 甄别

--04C3-4 算法

--04C3-5 括号

-第四章 栈与队列--(c3)栈应用:栈混洗

-(c4)栈应用:中缀表达式求值

--04C4-1 把玩

--04C4-2 构思

--04C4-3 实例

--04C4-4 算法框架

--04C4-5 算法细节

--04C4−6A 实例A

--04C4−6B 实例B

--04C4−6C 实例C

--04C4-6D 实例D

-(c4)栈应用:中缀表达式求值--作业

-(c5)栈应用:逆波兰表达式

--04C5-1 简化

--04C5-2 体验

--04C5-3 手工

--04C5-4 算法

-第四章 栈与队列--(c5)栈应用:逆波兰表达式

-(d)队列接口与实现

--04D-1 接口

--04D-2 实例

--04D-3 实现

-第四章 栈与队列--本章测验

第五章 二叉树

-(a)树

--05A-1 动机

--05A-2 应用

--05A-3 有根树

--05A-4 有序树

--05A-5 路径+环路

--05A-6 连通+无环

--05A-7 深度+层次

-(a)树--作业

-(b)树的表示

--05B-1 表示法

--05B-2 父亲

--05B-3 孩子

--05B-4 父亲+孩子

--05B-5 长子+兄弟

-第五章 二叉树--(b)树的表示

-(c)二叉树

--05C-1 二叉树

--05C-2 真二叉树

--05C-3 描述多叉树

-(c)二叉树--作业

-(d)二叉树实现

--05D-1 BinNode类

--05D-2 BinNode接口

--05D-3 BinTree类

--05D-4 高度更新

--05D-5 节点插入

-(d)二叉树实现--作业

-(e1)先序遍历

--05E1-1 转化策略

--05E1-2 遍历规则

--05E1-3 递归实现

--05E1-4 迭代实现(1)

--05E1-5 实例

--05E1-6 新思路

--05E1-7 新构思

--05E1-8 迭代实现(2)

--05E1-9 实例

-(e1)先序遍历--作业

-(e2)中序遍历

--05E2-1 递归

--05E2-2 观察

--05E2-3 思路

--05E2-4 构思

--05E2-5 实现

--05E2-6 实例

--05E2-7 分摊分析

-第五章 二叉树--(e2)中序遍历

-(e4)层次遍历

--05E4-1 次序

--05E4-2 实现

--05E4-3 实例

-第五章 二叉树--(e4)层次遍历

-(e5)重构

--05E5-1 遍历序列

--05E5-2 (先序|后序)+中序

--05E5-3 (先序+后序)x真

-(e5)重构--作业

-本章测验--作业

第六章 图

-(a)概述

--06A-1 邻接+关联

--06A-2 无向+有向

--06A-3 路径+环路

-(a)概述--作业

-(b1)邻接矩阵

--06B1-1 接口

--06B1-2 邻接矩阵+关联矩阵

--06B1-3 实例

--06B1-4 顶点和边

--06B1-5 邻接矩阵

--06B1-6 顶点静态操作

--06B1-7 边操作

--06B1-8 顶点动态操作

--06B1-9 综合评价

-(b1)邻接矩阵--作业

-(c)广度优先搜索

--06C-1 化繁为简

--06C-2 策略

--06C-3 实现

--06C-4 可能情况

--06C-5 实例

--06C-6 多连通

--06C-7 复杂度

--06C-8 最短路径

-(c)广度优先搜索--作业

-(d)深度优先搜索

--06D-1 算法

--06D-2 框架

--06D-3 细节

--06D-4 无向图

--06D-5 有向图

--06D-6 多可达域

--06D-7 嵌套引理

-(d)深度优先搜索--作业

-第六章 图--本章测验

02A-3 接口操作实例笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。