思考题
2-1 (在归并排序中对小数组采用插入排序) 虽然归并排序的最坏情况运行时间为Θ(nlgn),而插入排序的最坏情况运行时间为Θ(n2),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快。因此,在归并排序中当子问题变得足够小时,采用插入排序来使递归的叶变粗是有意义的。考虑对归并排序的一种修改,
39其中使用插入排序来排序长度为k的n/k个子表,然后使用标准的合并机制来合并这些子表,这里k是一个待定的值。
a.证明:插入排序最坏情况可以在Θ(nk)时间内排序每个长度为k的n/k个子表。
b.表明在最坏情况下如何在Θ(nlg(n/k))时间内合并这些子表。
c.假定修改后的算法的最坏情况运行时间为Θ(nk+nlg(n/k)),要使修改后的算法与标准的归并排序具有相同的运行时间,作为n的一个函数,借助Θ记号,k的最大值是什么?
d.在实践中,我们应该如何选择k?
2-2 (冒泡排序的正确性) 冒泡排序是一种流行但低效的排序算法,它的作用是反复交换相邻的未按次序排列的元素。
BUBBLESORT(A)
1 for i = 1 to A.length - 1
2 for j = A.length downto i + 1
3 if A[j] < A[j - 1]
4 exchange A[j] with A[j - 1]
a.假设A′表示BUBBLESORT(A)的输出。为了证明BUBBLESORT正确,我们必须证明它将终止并且有:
A′[1]≤A′[2]≤…≤A′[n](2.3)
其中n=A.length。为了证明BUBBLESORT确实完成了排序,我们还需要证明什么?
下面两部分将证明不等式(2.3)。
b.为第2~4行的for循环精确地说明一个循环不变式,并证明该循环不变式成立。你的证明应该使用本章中给出的循环不变式证明的结构。
c.使用(b)部分证明的循环不变式的终止条件,为第1~4行的for循环说明一个循环不变式,该不变式将使你能证明不等式(2.3)。你的证明应该使用本章中给出的循环不变式证明的结构。
40
d.冒泡排序的最坏情况运行时间是多少?与插入排序的运行时间相比,其性能如何?
2-3 (霍纳(Horner)规则的正确性) 给定系数a0,a1,…,an和x的值,代码片段
1 y = 0
2 for i = n downto 0
3 y = ai + x·y
实现了用于求值多项式
P(x)=∑nk=0akxk=a0+x(a1+x(a2+…+x(an-1+xan)…))
的霍纳规则。
a.借助Θ记号,实现霍纳规则的以上代码片段的运行时间是多少?
b.编写伪代码来实现朴素的多项式求值算法,该算法从头开始计算多项式的每个项。该算法的运行时间是多少?与霍纳规则相比,其性能如何?
c.考虑以下循环不变式:
在第2~3行for循环每次迭代的开始有
y=∑n-(i+1)k=0ak+i+1xk
把没有项的和式解释为等于0。遵照本章中给出的循环不变式证明的结构,使用该循环不变式来证明终止时有
y=∑nk=0akxk。
d.最后证明上面给出的代码片段将正确地求由系数a0,a1,…,an刻画的多项式的值。
2-4 (逆序对) 假设A[1..n]是一个有n个不同数的数组。若iA[j],则对偶(i,j)称为A的一个逆序对(inversion)。
a.列出数组〈2,3,8,6,1〉的5个逆序对。
41
b.由集合{1,2,…,n}中的元素构成的什么数组具有最多的逆序对?它有多少逆序对?
c.插入排序的运行时间与输入数组中逆序对的数量之间是什么关系?证明你的回答。
d.给出一个确定在n个元素的任何排列中逆序对数量的算法,最坏情况需要Θ(nlgn)时间。(提示:修改归并排序。)
《计算机程序设计艺术》第1卷第3版英文影印版已由机械工业出版社出版,ISBN 978-7-111-22709-0。——编辑注
《计算机程序设计艺术》第3卷第2版英文影印版已由机械工业出版社出版,ISBN 978-7-111-22717-5。——编辑注