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

思考题

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值