算法导论13章红黑树 思考题总结
2015-10-20 11:40
267 查看
13-1 (持久动态集合) 有时在算法的执行过程中我们会发现在更新一个动态集合时,需要维护其过去的版本。我们称这样的集合为持久的(persistent)。实现持久集合的一种方法是每当改集合被修改时,就将其完整地复制下来,但是这种方法会降低一个程序的执行速度,而且占用过多的空间。有时候,我们可以做得更好些。
考虑一个有 INSERT、DELETE和SEARCH操作的持久集合 S,我们使用如图13-8(a)所示的二叉搜索树来实现。对集合的每一个版本都维护一个不同的根。为了将关键字 5 插入到集合中,创建一个具有关键字 5 的新结点。该结点成为具有关键字 7 的新结点的左孩子,因为我们不能更改具有关键字 7 的已存在结点。类似地,具有关键字 7 的新结点成为具有关键字 8 的新结点的左孩子,后者的右孩子成为具有关键字 10
的已存在结点。关键字为 8 的新结点又成为关键字为 4 的新根结点 r' 的右孩子,而 r' 的左孩子是关键字为 3 的已存在结点。这样,我们只是复制了树的一部分,新树共享了原树的一些结点,如图13-8(b)所示。
假设树中每个结点都有属性 key、left 和 right,但没有属性parent。
a. 对于一课一般的持久二叉搜索树,为插入一个关键字 k 或删除一个结点 y,需要改变那些结点。
ANSWER:
插入:需要修改插入路径上的每一个结点。
删除:① 若 z 有不多于一个儿子,则 z 的所有祖先都需要修改。
② 若 z 有两个儿子,则 z 的后继 y 会移动到 z 的位置,所以 y 和 z 的祖先均需修改。(特别地,若 z 是 y 的祖先,上面的说法也成立。)
b.请写出一个过程 PERSISTENT-TREE-INSERT,使得在给定一棵持久树 T 和一个要插入的关键字 k 时,它返回将 k 插入 T 后得到的新的持久树 T'。
ANSWER:
c. 如果持久二叉搜索树 T 的高度为 h,实现 PERSISTENT-TREE-INSERT 过程的时间和空间需求分别是多少?(空间需求与新分配的结点数成正比。)
ANSWER:时间和空间均为 O(h) 复杂度。
d. 假设在每个结点中增加一个父结点属性。这种情况下,PERSISTENT-TREE-INSERT 需要做一些额外的复制工作。证明:PERSISTENT-TREE-INSERT 的时间需求和空间需求为 Ω(n),其中 n 为树中的结点个数。
AMSWER:因为插入过程,形成了新的根结点,所以根结点的子结点需指向新的父结点;然后对根结点的子树递归,亦然。所以需要对 n 个结点进行修改,所以时间和空间均为 Ω(n)。
考虑一个有 INSERT、DELETE和SEARCH操作的持久集合 S,我们使用如图13-8(a)所示的二叉搜索树来实现。对集合的每一个版本都维护一个不同的根。为了将关键字 5 插入到集合中,创建一个具有关键字 5 的新结点。该结点成为具有关键字 7 的新结点的左孩子,因为我们不能更改具有关键字 7 的已存在结点。类似地,具有关键字 7 的新结点成为具有关键字 8 的新结点的左孩子,后者的右孩子成为具有关键字 10
的已存在结点。关键字为 8 的新结点又成为关键字为 4 的新根结点 r' 的右孩子,而 r' 的左孩子是关键字为 3 的已存在结点。这样,我们只是复制了树的一部分,新树共享了原树的一些结点,如图13-8(b)所示。
假设树中每个结点都有属性 key、left 和 right,但没有属性parent。
a. 对于一课一般的持久二叉搜索树,为插入一个关键字 k 或删除一个结点 y,需要改变那些结点。
ANSWER:
插入:需要修改插入路径上的每一个结点。
删除:① 若 z 有不多于一个儿子,则 z 的所有祖先都需要修改。
② 若 z 有两个儿子,则 z 的后继 y 会移动到 z 的位置,所以 y 和 z 的祖先均需修改。(特别地,若 z 是 y 的祖先,上面的说法也成立。)
b.请写出一个过程 PERSISTENT-TREE-INSERT,使得在给定一棵持久树 T 和一个要插入的关键字 k 时,它返回将 k 插入 T 后得到的新的持久树 T'。
ANSWER:
<span style="font-size:18px;">伪代码 PERSISTENT-TREE-INSERT(root, k): if root == NIL: newr = make-new-node(k) else: newr = copy-node(root) if k.key < z.key: newr.left = make-new-node(newr.left, k) else: newr.right = make-new-node(newr.right, k) return newr</span>
c. 如果持久二叉搜索树 T 的高度为 h,实现 PERSISTENT-TREE-INSERT 过程的时间和空间需求分别是多少?(空间需求与新分配的结点数成正比。)
ANSWER:时间和空间均为 O(h) 复杂度。
d. 假设在每个结点中增加一个父结点属性。这种情况下,PERSISTENT-TREE-INSERT 需要做一些额外的复制工作。证明:PERSISTENT-TREE-INSERT 的时间需求和空间需求为 Ω(n),其中 n 为树中的结点个数。
AMSWER:因为插入过程,形成了新的根结点,所以根结点的子结点需指向新的父结点;然后对根结点的子树递归,亦然。所以需要对 n 个结点进行修改,所以时间和空间均为 Ω(n)。
相关文章推荐
- 8.Spark集群测试
- STM32F4——SD卡相关操作
- Linux流量监控的几个方法
- Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
- 优化UITableViewCell高度计算的那些事
- GetMemory的典型例子分析
- HttpClient使用总结
- iOS UITableView 修改 分区表头的样式和颜色
- 值得推荐的C/C++框架和库
- Servlet实现图片读取显示
- 本地/远程Service 和Activity 的交方式(转)
- jni调试
- C# Datatable排序重新排序
- 百度分享js代码
- 大神用法 | 我是这样「拆建」笔记结构的
- Laravel如何与App通信(针对get与post)
- 关于mysql上万条数据同时插入时的性能优化
- JVM内存设置
- percona 安装及配置
- 运维人员应该掌握哪些常用技术