您的位置:首页 > 编程语言 > Go语言

算法导论第七章习题答案(第三版) Introduction to Algorithm

2013-11-02 11:09 1061 查看

Exercises

7.1-1.略。

7.1-2.

返回的q值等于r,当数组中所有元素都相同时,可以将等于主元的值轮流放到两个集合中。

7.1-3

for循环正好是Θ(n)的复杂度,所以PARTITION的时间复杂度是Θ(n)。

7.1-4.略。

7.2-1

\[T(n) = T(n - 1) + \Theta (n) = c{n^2} - (2cn - 1 - bn)\]

当c>b时,2cn-1-bn>0,当c<b/2时,2cn-1-bn<0,所以上式的时间复杂度是Θ(n2)。

7.2-2

Θ(n2)。

7.2-3

降序排列的话,会导致每一次划分都是最坏情况,所以时间复杂度是Θ(n2)。

7.2-4

因为银行的支票编号基本上都是有序的,插入排序只需插入最小的元素即可,而对于快速排序来说,这已经接近最坏情况,所以INSERTION-SORT的性能往往要优于QUICKSORT。

7.2-5

画出递归树即可求得。

7.2-6

若按α:1-α的比例来划分的话,左子树拥有元素个数是nα,右子树是(1-α)n,所以若想得到更平衡的划分,共有(1-α)n-nα中可能,所以概率为((1-α)n-nα)/n。

7.3-1

因为随机化算法的目的是减小期望的运行时间,而去降低最坏运行时间的概率。

7.3-2

随机数生成器RANDOM被调用的次数就为选出主元的次数,所以无论是最好还是最坏情况,被调用的次数都为Θ(n)。

7.4-1.略。

7.4-2

最好情况下:

\[T(n) = 2T(\frac{n}{2}) + \Theta (n)\]

可计算出快速排序的运行时间为Ω(nlgn)。

7.4-3

数学问题,计算即可。

7.4-4.略。

7.4-5

显然根据递归树等的分析即可证出该式。至于k的选择,这是在网上找的大神的分析:



7.4-6

Thinking Problems

7-1

a.略。

b.一旦进入循环,i和j的值就会加1或者减1,所以永远不会访问子数组以外的元素。

c.因为永远不会访问数组以外的元素,所以返回的时候j仍是在[p,r]之间,所以p≤j<r,因为A[i]=A[p],观察循环可以得知至少要循环两遍,所以j不能等于r。

d.用循环不变式证明即可。

e.略。

7-2

a.Θ(n2)。

b.在partition的过程中,记录等于A[q]的个数count,在结尾返回t的值即为q+count。

c.略。(稍微改动即可)。

d.p到t中的元素不用参与下一次的比较。

7-3

a.E[Xi]=1/n。

b.该式的意思就是利用指示器随机变量,将所有情况列出和,再求出期望。

c.因为T(q-1)和T(n-q)在q=1...n的区间中,有重复的值,所以\(\sum\limits_{q = 1}^n {(T(q - 1) + T(n - q)} ) = 2\sum\limits_{q = 2}^n {(T(q)} \)

将q=1,2归入后面的Θ(n)中.........这时候结果已经很显然了。

d.拆开之后根据级数和不等式的知识即可证明。

e.此时结果已经很显然了。

7-4

a.略。

b.最坏情况划分即为下次递归调用的比上一次少1。这样,栈的深度即为n。

c.可以随机化选择主元。也可以通过比较划分之后的两个子数组去选择较小的数组去递归,留大的子数组去循环。

7-5

a.\[{p_i} = \frac{{(i - 1)(n - i)}}{{C_n^3}}\]

b.用上式所求的期望与1/n做比即可求得(数学能力不好,还望广大网友告知计算方法)。

c.\[lim_{n \to \infty } \frac{1}{n}\sum_{i=\frac{n}{3}}^{\frac{2n}{3}} \frac{6(i-1)(n-i)}{n^2} = \int_{\frac{1}{3}}^{\frac{2}{3}} 6x(1-x) dx = \frac{13}{27}\]

d.递归树的高度是不变的,只是使递归树划分的更加均匀而已,所以只会影响时间复杂度的常数因子。

7-5

区间的模糊排序只是为了能在各个区间里找到数,使其能组成一个排序序列,所以,区间里有重合的部分即可视为相等,共分为三段。这样题目结果就很显然了。

(若有错误和不足,欢迎大家积极指正!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: