当前课程知识点:数据结构(下) > 第八章 高级搜索树(下) > (xa1)红黑树:动机 > 08XA1-2 持久性
回顾我们以前所学过的数据结构
不论是线性的向量 列表 栈或队列
也无论半线性的树结构 以及非线性的图结构
它们大多呈现这么样一种特征
每当经过一次动态的操作 使得其中的逻辑结构发生变化之后
它都会随即完全的转入新的状态 同时将此前的状态完全的遗忘掉
这类结构也因此称作ephemeral data structure
也就是说 它们都是随时变化的 每一个状态只会存在于某一个瞬间
而每一个瞬间都是朝生暮死 稍纵即逝的
然而在实际应用中 往往可能会有更高的要求
比如 若将数据结构比作是人
那么它的每一个瞬间状态 都相当于人一生中某一时刻的快照
我们或许会对他的历史档案感兴趣
并希望能够任意调阅甚至修改某个历史时刻的档案
因此无论静态还是动态操作 除了指定目标关键码
还需要同时指定一个版本号
用以说明我们是在这个数据结构的哪一份历史档案中去查找特定对象
如果一个数据结构能够支持这种类型的需求
就称作是persistent structures
也就是所谓的一致性结构 或者持久性结构
乍看起来 任意数据结构的持久化都不是那么困难的一件事
比如一种直接了当的方法就是
为数据结构的每一个所需的版本 都独立的保存一份快照
同时将所有版本的入口组成一个搜索结构
这里我们针对一棵真实的BBST 记录了它整个生命期内的5个版本
这样 一旦指定了版本号 我们就可以转入对应的快照
并按照常规搜索方法在其中定位需要操作的元素
从单次访问的效率而言 我们甚至可以说这个结构还可以接受
是的 如果我们将整个历史快照的数目记作h
那么每次我们只需logh的时间 便可确定版本档案的入口
接下来再花费logn的时间 在这份档案中进行定位和操作
然而就空间而言 这种方法是断乎不可接受的
我们可以看到 在这样的一组历史快照中
每一个元素 无论是它 还是它 以及它
都可能会被保存多份
渐近的来说 n个元素中的每一个都有可能在这组档案中被保存多达h份
这就意味着空间复杂度 将伴随着h成线性的速度增长
我们知道 空间复杂度 自然也构成了时间复杂度的一个下限
因此在整个历史过程中 为了生成和记录所有的快照
我们累计所花费的时间 也会多达这样一个规模
分摊下来 我们为了生成每一组快照
都大致需要花费线性的时间 创建一个完整的副本
那么我们可否就此做一改进呢
比如除了所有元素各自所占用的空间
我们是否能够将每一个版本所消耗的均摊空间量
控制在logn的范围内呢
答案是可以
为此我们需要利用同一数据结构相邻版本之间的关联性
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试