当前课程知识点:数据结构(上) > 第二章 向量(上) > (c)无序向量 > 02C-4 区间删除
再来考察删除算法
我们先考虑一个通用的一个版本
也就是所谓的区间删除
具体来说,也就是
在某个向量中
我们要将介于lo和hi之间的
一系列的元素
成批地从中剔除掉
当然,因为向量要求所有的元素
始终都是彼此紧邻排列的
所以不应该在删除之后
留下这个缝隙
换而言之,我们需要将它
后继的那些元素
如果有的话,统一地向前
或者说向左移动
来填补这段空白
其实,你可以反过来看到
如果能够完成
这样的一个左移的话
那么实际上也就相当于
把这些元素给剔除
或者叫覆盖掉了
所以我们说,关键的任务在于
如何实现这个左移
这样的一个过程
大致可以实现为这样一段代码
而其中最最关键的是
这个while循环
它会遍历整个后缀
并且将其中的每一个元素
逐一地取出
向前转移到合适的位置
比如说,第一个转移的是
hi这个位置上的这个元素
它将被转移到lo这个位置
紧接着,是hi加1
转移到lo加1
hi加2转移到lo加2,直到最后
这里同样有两个问题
需要强调说明
第一个问题
在整个移动的过程中
所有这些元素参与移动的
先后次序,同样也是很敏感的
或者说不能更改的
与刚才插入算法完全颠倒
刚才是自后向前
现在呢,是越往前的元素
越优先参与移动
所以我们也可以认为它是一个
自前向后的前移操作
如果把这个次序颠倒过来
会怎么样呢?
我们说是有风险的
比如说,在这样一种情况下
两者,也就是说这个前缀的
原来的那个位置
和后来的那个位置
如果中间有相互重叠的部分
那么我们如果优先移动
后面的那个元素
那么它就有可能会
同样地造成,这种重叠区间的元素
在无意中被覆盖掉
第二点呢,是大家注意到
我们这里还有一个对shrink
这个历程的调用
顾名思义
它是某种意义上讲的缩容
这种操作在实际应用中
并不是必须的
我们往往可以忽略它
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验