当前课程知识点:数据结构(上) > 第二章 向量(上) > (c)无序向量 > 02C-5 单元素删除
再来考察删除操作的另一个版本
也就是单元素的操作
既然此前已经实现了
区间的批量删除操作的接口
所以我们不妨把
这种单元素的操作
视作是整个区间操作的特例
具体来说
我们要借助这样一个转换
也就是,将任何一个由
单个元素构成的区间
视作是由 r 到 r+1
所定义的左闭右开的
那段区间
如果想到这里的话
就可以很简明地得到
这样一种实现的方式
在这里最重要的一句
就是调用此前重载的
那个remove接口
只不过这里的参数
我们改变为 r 和 r+1
与我们刚才的那种转换相对应
也就是说
我们确实可以把一个
向量中特定的某一个元素 r
借助此前的算法
同样地把它删除掉
而那个操作
我们再回顾一下
无非就是所有的后缀
向前移动一个单位
至此,有些同学
可能会提出一个疑问
我们这里为什么不反过来
基于单元素删除接口
通过反复的调用来实现
区间删除呢?
从道理上看,这个方法是可行的
比如说,对于一个特定的一段区间
从 lo 到 hi
我们可以对其中的每一个元素
分别去调用一次
单元素删除接口
从而完成整体的删除操作
我们说这毫无问题
但是正如我们此前所讲过的
数据结构更多的关注的是效率
实际上,我们很快就会看到
从效率上看,这个方法是非常差的
为什么呢?
先来看一下单元素
删除这个版本本身的效率
我们讲过,在这里
最重要的实际上是这段区间
也就是被删除元素的那些后继们
统一地要向前移动一次
这也是它的复杂度的来源
所以也正因为如此,我们说
它的复杂度是取决于
它的后继的个数
反过来,如果确实是
按这样的一个方式
来反复调用的话
那么对于这个区间
我们说这个宽度是
hi 减 lo 中的所有的元素
我们都要执行一次
对他们公共的这些后缀
向前移动一格的操作
而这个成本是多少呢?
每一个元素
所对应的这样一趟移动
累计起来都至少是 n 减掉 h
这两个量在最坏的情况下
都可能与 n 是同阶的
换而言之,这种算法
有可能会导致 n 平方的复杂度
相对于我们此前的那种操作
充其量不过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)深度优先搜索--作业
-第六章 图--本章测验