算法导论12章二叉搜索树 思考题总结

12-1 (带有相同关键字的二叉搜索树) 相同关键字给二叉搜索树的实现带来了问题。

a. 当用TREE-INSERT 将 n 个其中带有相同关键字的数据插入到一棵初始为空的二叉搜索树中,其渐进性能是多少?

ANSWER:当遇到不小于父结点的关键字时,是插入到右子树,所以当插入n个全部相同或者有序的关键字时,会变成链表,最坏情况的时间复杂度为O(n^2),树的高度是O(n)。


       建议通过在第5行之前测试 z.key = x.key 和在第11行之前测试 z.key = y.key 的方法,来对 TREE-INSERT 进行改进。如果相等,根据下面的策略之一来实现。对于每个策略,得到将 n 个其中带有相同关键字的数据插入到一棵初始为空的二叉搜索树中的渐进性能。(对第 5 行描述的策略是比较 z 和 x 的关键字,用于第 11 行的策略是用 y 代替 x。)

b. 在结点 x 设置一个不二标志 x.b,并根据 x.b 的值,置 x 为 x.left 或 x.right,当插入一个与 x 关键字相同的结点时,每次访问 x 时交替地置 x.b 为 FALSE 或 TRUE。

ANSWER:这样插入输的高度将平衡地变为O(lgn),插入的时间复杂度是O(nlgn)。


c. 在 x 处设置一个与 x 关键字相同的结点列表,并将 z 插入到该列表中。

ANSWER:

树的期望高度为O(lgn),插入的期望时间为O(nlgn)。

最优情况是所有关键字都相同,则全部 n 个关键字都插入到结点列表中,插入列表时间为O(1),n 次插入时间为O(n)。

这种情况的最坏情况和期望时间与 n 个不带相同关键字的数据插入到二叉搜索树一样。


d. 随机地置 x 为 x.left 或 x.right。(给出最坏情况性能, 并非形式地导出期望运行时间。)

ANSWER:最坏情况就是和 a 的一样,相同关键字全部插入到同一侧。


12-2 (基数树) 给定两个串 a = a0a1...ap 和 b = b0b1...bq,这里每个 ai 和 bi 是以字符集的某种次序出现的,如果下面两种规则之一成立,就称串 a 按字典序小于串 b:

1.存在一个整数 j,其中 0 ≤ j ≤ min(p, q),使得对所有的 i = 0,1,... ,j-1,ai = bi 成立,且 aj < bj。

2.p < q,且对所有的i = 0,1,... ,p, ai = bi。

 例如,如果 a 和 b 是位串,那么10100 < 10110(由规则1,取 j = 3),10100 < 1010001(由规则2)。这种次序类似于英语字典中使用的排序。

基数树(radix tree)数据结构如图 12-5 所示,这个数存储了位串1011、10、011、100和0。

当对一个关键字 a = a0a1...ap 进行查找时,在深度为 i 的一个结点处,如果 ai = 0,则走左侧;如果 ai = 1,则走右侧。设 S 是一个不同位串组成的集合 ,各个串长度值和为 n。说明如何使用一棵基数树在 Θ(n) 时间内按字典序对 S 进行排序。对于图 12-5 所示的例子,排序输出的应该是序列 0、011、10、100、1011。

ANSWER:基数树的深度 = 结点关键字的长度。

所以对于长度为 i 的关键字插入需要 i 步,所以长度值和为 n 的集合插入到基数树时间为Θ(n),再用前序遍历输出即为排序结果,时间也是Θ(n),所以总时间为Θ(n)。


12-3 (随机构建二叉搜索树中的平均结点深度) 在本题中,要证明有 n 个结点的一棵随机构建二叉搜索树中的结点平均深度为O(lgn)。虽然这个结果弱于定理12.4,但我们使用的方法显露出构建一棵二叉搜索树与 7.3 节中的RANDOMIZED-QUICKSORT 的执行之间有着惊人的相似之处。

       定义一棵二叉搜索树 T 的路径总长度 P(T) 为 T 中所有结点 x 的深度之和,对每个结点 x 的深度表示为 d(x, T)。

a. 证明:T 中的一个结点平均深度是 1/n Σ (x∈T) d(x, T) = 1/n * P(T)。

ANSWER:根据定义,n 个结点的深度为Σ (x∈T) d(x, T) = P(T),所以一个结点的平均深度就是1/n Σ (x∈T) d(x, T) = 1/n * P(T)。


       因此,我们希望进一步证明 P(T) 的期望值为 O(nlgn)。

b. 设 TL 和 TR 分别表示树 T 的左子树和右子树,证明:如果 T 有 n 个结点,则P(T) = P(TL) + P(TR) + n - 1。

ANSWER:根结点的高度比左右儿子的高度大 1。∴d(x, T) = d(x, TL) + 1,d(x, T) = d(x, TR) + 1。

对于树 T ,除了根结点外的每个结点在 T 的左右子树的高度都相应减少 1 ,除了根结点外,共有 n-1 个结点,所以P(T) = P(TL) + P(TR) + n - 1。


c. 设 P(n) 表示有 n 个结点的随机构建二叉搜索树的平均路径总长度,证明:P(n) = 1/n * Σ(i = 0, n-1) (P(i) + P(n - i - 1) + n - 1)。

ANSWER:对于题 b 的等式 P(T) = P(TL) + P(TR) + n - 1,T 的左右子树的结点数目分别是 i 和 n-i-1,i ∈[0 , n-1]。对于这 n 种情况的 p(n) 的总和 = Σ(i = 0, n-1) (P(i) + P(n - i - 1) + n - 1),所以平均路径总长度 p(n) = 1/n * Σ(i = 0, n-1) (P(i) + P(n - i - 1) + n - 1)。


d. 说明如何将 P(n) 重写为:p(n) = 2/n * Σ(k=1, n-1)( P(k) ) + Θ(n)。

ANSWER:



e. 思考题 7-3 曾给出随机快速排序的另一种分析,试证明结论:P(n) = O(nlgn)。

        在快速排序的每次递归调用时,总要选择一个随机划分元来为待排序的元素集合进行划分。二叉搜索树的每个结点都是对以该结点为根的子树中所有元素进行划分。

ANSWER:和思考题 7-3 一样,先证明Σ(k=1, n-1) klgk ≤ 1/2*n^2lgn - 1/8*n^2;将左边的累加式分成 k = 1,2, ... , ⌈n/2⌉-1 和 k = ⌈n/2⌉, ... , n-1 这两部分,即可提取到不等式右边的(-1/8*n^2)。然后在利用代入法,证明 P(n) ≤ cnlgn 对于某个正常数 c 和足够大的 n 都成立。


f. 请给出快速排序的一种实现,使快速排序中一组元素的比较与将这些元素插入一棵二叉搜索树中所需的比较恰好相同。(这些比较的次序可以不同,但出现的比较一定要一样。)

ANSWER:二叉搜索树的插入是每次均先与跟结点比较,然后放在左子树或右子树;再与左子树或右子树的根结点继续比较。对快排而言,每个元素均与主元比较,然后放在主元的左侧或右侧,再与左侧或右侧的主元继续比较。

所以可以令第一次放在主元左(右)侧的元素称为左(右)侧子数组的主元,相当于左(右)子树的根结点。


12-4 (不同二叉树的书目) 设 bn 表示含有 n 个结点的不同二叉树的数目。在本题中,试给出一个球 bn 的公式和一个渐近估计。

a. 证明:b0 = 1 且对 n ≥ 1,有 bn = Σ(k=0, n-1) bk*b(n-1nk)。

ANSWER:



b. 参考思考题 4-4 中生成函数的定义,设 B(x) 是下面的生成函数:B(x) = Σ(n=0, )bn*x^n。证明:B(x) = xB(x)^2 + 1,因此以闭形式表示 B(x) 的一种方式是 B(x) = 1/2x*(1 - (1-4x)^0.5)。

ANSWER:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值