《算法导论(原书第3版)》一思考题

    xiaoxiao2021-04-16  263

    思考题

    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。——编辑注

    相关资源:算法导论第三版部分练习和思考题答案

    最新回复(0)