您的位置:首页 > 其它

算法导论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:

<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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: