当前课程知识点:数据结构(上) > 第三章 列表 > (c)有序列表 > 03C-1 唯一化·构思
同学们好
接下来的这几节
我们重点讨论有序列表
也就是说 我们假设其中的元素
不仅可以比较大小
而且已经按照这种大小关系有序地排列
我们将会看到 在这样的一个条件下
很多问题都存在更加高效的解法
我们现在就来看其中一例
依然以唯一化问题为例
我们知道有序向量的唯一化
可以比无序向量的唯一化
更快地完成
那么有序列表的唯一化
是否也能够比无序列表的唯一化
完成地更快呢?
在给出具体的算法之前
我们先来介绍一下
这个算法的思路
回忆一下
在有序向量的去重算法中
我们曾经介绍过这样一个事实
在任何一个有序的序列中
如果存在重复元素
那么每一组重复元素
必然会彼此紧邻地排列成
一个又一个的分组
每一个分组都有
彼此相同的一组元素构成
而唯一化的任务
可以等效地理解是
从每一组中挑选出一个代表
而将其余的元素都剔除掉
于是仿照有序向量的唯一化算法
我们这里也可以得到
一个迭代式的算法
具体来讲 每一次迭代
我们都将注意力关注于
当前以p指示的那个节点
同时 我们还要考虑p的直接后继
如果命名为q的话
在经过一次比对之后
如果发现p和q相等
我们就可以将后者剔除掉
而这个呢 可以通过列表
所提供的remove标准接口来实现
此后q将指向新的后继节点
同样地 在接下来的一步迭代中
我们依然会发现q与p相等
所以可以继续将它删除
以及再接下来的雷同节点
在某一步接下来的迭代中
情况可能发生变化
也就是说
我们首次发现一个与p不同的节点
这个时候就预示着
一个新的区段出现了
作为这个新的区段的首节点
我们将保留这个节点
而为了这个算法能够继续计算下去
我们不妨将p由原来的位置
转向这个新发现的不同的节点
可以看到 经过这样一轮迭代之后
刚才相同的一组元素中
除了第一个
其余的后继都被删除掉了
再接下来呢
我们可以如法炮制
相应地 删除这些雷同的节点
以及这些雷同的节点
以及诸如此类的后继所有雷同节点
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验