算法导论第十三章思考题参考答案(25)

 不积硅步,无以至千里。请走下去,尽管前路艰难。

                                                                                        -- 2024-3-19


Problem13-1

a.我们需要为插入或删除的节点的祖先节点创建一个新版本。
b.参见算法PERSISTENT-TREE-INSERT


c.因为while循环最多只运行h次,因为从x到根结点的距离每次都增加1,并且以高度为界。此外,由于每次迭代只花费恒定的时间和使用恒定的额外空间,我们的时间和空间复杂性都是O(h)。
d.当插入一个元素时,需要创建一个新版本的根目录。因此,指向根的任何节点都必须有一个新的副本,以便它们指向新的根。所以,所有深度为1的节点都必须被复制。同样,指向这些节点的所有节点都必须具有新副本,以便具有正确的版本。所以,所有深度为2的节点都必须被复制。同样,必须复制所有节点。所以我们至少需要Ω(n)的时间和额外的空间。

e.由于再平衡操作只能更改祖先节点和祖先节点的子节点,因此每次插入最多只需要分配2h个新节点,因为树的其余部分将保持不变。当然,这是假设我们不跟踪父指针。这可以通过将13.3-6中的建议应用于插入和删除来实现。也就是说,我们对存储O(h)个祖先或祖先的子元素的元素执行搜索。由于在执行插入和删除过程时只考虑这些节点,因此我们可以知道它们的父节点,即使我们不跟踪每个节点的父指针。由于高度保持为O(lg(n)),那么,我们可以在O(lg(n))内完成所有的操作。 

 Problem13-2

a.当我们调用插入或删除时,我们最多修改树的黑高度1,我们可以根据我们所处的情况修改它,所以不需要额外的存储空间。当通过T下降时,我们可以在O(1)时间内确定每个访问节点的黑高度。首先在O(log n)时间内确定根结点的黑高度。当我们向下移动树时,我们只需要将每个黑节点的高度减少1,就可以确定新的高度,这可以在O(1)内完成。因为从根到叶的路径上有O(log n)个节点,所以每个节点的时间是常数。

b.在O(log n)时间内求出T1的黑高度。然后在O(log n)时间内求出T2的黑高度。最后,设z = T1.root。而z的黑高度严格大于T2。如果存在这样的子结点,将z更新为z.right,否则将z更新为z.left,一旦z的高度等于T2。从T1的高度开始,该算法的运行时间为O(log n),因此while循环的迭代次数最多为O(log n)。
c.设T表示想要的树。设T .root = x, x. left = y, y.p = x, x.right = T2.root和T2.root.p = x, Ty的每个元素都在T1中,T1只包含小于x的元素,T2的每个元素都大于x,由于Ty和T2都具有二叉搜索树的性质,T也具有二叉搜索树的性质。
d.把x涂成红色。在T1中求出y,如在b部分中,并在常数时间内形成T = Ty∪{x}∪T2如在c部分中。调用T' = RB-TRANSPLANT(T,y,x)。如果y的父结点是红色,我们就有可能违反红黑性质。为了解决这个问题,调用RB-INSERT-FIXUP(T', x)。
e.在对称情况下,简单地将b部分到d部分中T1和T2的作用颠倒。
f.如果T1.bh≥T2。否则,请将d中T1和T2的角色对调,然后按前面的步骤进行操作。无论哪种方式,算法都需要O(log n)时间,因为RB-INSERT-FIXUP是O(log n)。 

 Problem13-3

a.设T(h)表示高度为h的AVL树的最小大小,因为它的高度是h,所以它的子树高度的最大值必须等于h−1。由于我们试图获得尽可能少的音符总数,假设另一个子结点的高度尽可能小。由于AVL树的限制,我们知道较小的子节点必须比较大的子节点至少小1,所以我们有T(h)≥T(h−1)+T(h−2)+1其中+1来自于根节点的计数。我们可以得到相反方向的不等式只要取一棵树在高度h - 1和h - 2上达到最小节点数并将它们连接在另一个节点下。我们得到T(h) = T(h - 1) + T(h - 2) + 1。T(0) = 0,T(1) = 1。这是相同的递归式和初始条件
斐波纳契数列。回想一下(3.25)式,我们有 

重新排列h,我们有

b.设UNBAL(x)表示x.left.h - x.right.h。然后,BALANCE算法执行所需的操作。请注意,因为我们一次只旋转一个元素,所以UNBAL(x)的值在每一步中最多只能改变2。而且,它最终必须开始发生变化,因为较短的树变得充满了元素。我们还修复了由于对子进程的递归调用而导致的AVL属性的破坏。

c.对于给定的算法AVL- insert (x,z),它通过我们搜索插入z的正确位置的方式正确地维护了它是一个BST的事实。此外,我们可以看到它保持了AVL的属性,因为在插入元素之后,它检查了所有的父元素的AVL属性,因为这些是它唯一可以破坏的地方。然后对其进行修复,并更新任何可能发生更改的节点的高度属性。
d.因为两个for循环只运行O(h) = O(lg(n))次迭代,我们知道这是运行时间。同样,在第二个while循环中只会发生一次旋转因为当我们这样做的时候,我们会降低那里的子树的高度,这意味着它会回到原来的高度,所以它的所有祖先的高度都是不变的,所以,不需要进一步的平衡。 

 Problem13-4

a.根r是唯一确定的,因为它必须包含最小的优先级。然后我们将节点集划分为键值小于r的节点和键值大于r的节点。我们必须将每一个节点都划分为一个节点集,并使它们成为r的左子节点和右子节点。通过对节点数的归纳,我们看到该节点集是唯一确定的。
b.由于选择随机优先级对应于以随机顺序插入,因此树的期望高度与随机构建的二叉搜索树的期望高度相同Θ(log n)。
c.首先像往常一样使用二叉搜索树插入过程插入一个节点。然后执行向左和向右旋转,直到插入节点的父节点不再具有更大的优先级。
d. TREAP-INSERT的预期运行时间为Θ(log n),因为treap的预期高度为Θ(log n)。
e.为了插入x,我们首先运行BST插入过程,所以x是一个叶节点。每次我们执行左旋转时,我们将左子树的右脊的长度增加1。每次执行右旋转时,右子树的左脊的长度增加1。由于我们只执行左右旋转,因此可以得出结论。
f.如果Xik = 1,则该属性必须符合二叉搜索树的属性和trep的定义。另一方面,假设y.key < z.key key表示y.priority < z.priority。如果y不是x的子元素,那么将z作为x和y的最小共同祖先就违反了这个定理。由于y.priority > x.priority,y一定是x的子节点。由于y.key < x.key, y在x的左子树中。如果y不在x的左子树的右子树中,那么一定存在某个z,使得y.priority > z.priority > x.priority和y.key < z.key < x.key,这是一个矛盾。
我们需要计算f部分条件满足的概率。对于所有z∈[i + 1, k−1],我们必须有x.priority < y.priority < z.priority。有(k−i−1)!排列这些z对应的优先级的方法,从(k−i+1)![i, k]中所有元素对应的优先级排列方法。消去得到P{Xik} =.

h.我们利用g部分将伸缩级数简化:

i.节点y位于x的右子树的左脊,当且仅当它位于每个键为k的节点被键为n - k的节点替换的树的左子树的右脊,在h部分的期望计算中将k替换为n - k得到结果。
j.根据e部分,旋转次数为C + D。根据期望的线性,对于任意k的选择,E [C + D] =

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值