《算法导论》[第2章] 算法入门-[2.2] 算法分析
|概念回顾|
算法分析即指对一个算法所需要的资源进行预测。
对于一个算法,一般只考察其最坏情况的运行时间,理由有三:
- 一个算法的最坏情况运行时间是在任何输入下运行时间的一个上界。
- 对于某些算法来说,最坏情况出现得还是相当频繁的。
- 大致上看来,“平均情况”通常和最坏情况一样差。
|习题解答|
2.2-1 用Θ形式表示函数n³/1000-100n²-100n+3。
答:Θ(n³)
2.2-2 考虑对数组A中的n个数进行排序的问题:首先找出A中的最小元素,并将其与A[1]中元素进行交换。接着,找出A中的次最小元素,并将其与A[2]中的元素进行交换。对A中头n-1个元素继续这一过程。写出这个算法的伪代码,该算法称为选择排序(selection)。对这个算法来说,循环不变式是什么?为什么它仅需要在头n-1个元素上运行,而不是在所有n个元素上运行?以O形式写出选择排序的最佳和最坏情况下的运行时间。
[问题1] 伪代码如下:
SELECTION-SORT(A)
for i←1 to n-1
do min←∞
for j←i to n
do if A[i]<min
then min←A[j]
minlabel←j
exchange A[i]↔A[minlabel]
[问题2] 循环不变式:
初始化:此时i=1,而子数组A[1..i]。亦即,它只包含一个元素A[1],显然是已排序的。
保持:在第二个for循环体中,即从A[i]到A[n]的数组元素中选出一个最小的,与第i个元素即A[i]互相交换相应的值,此时,因为假设已知A[1..i-1]已经排序好了,而新选出来的也同时大于A[i..i-1]中的任何一个数,这就是说A[1..i]也已排序。
终止:当i=n-1时,第二个for循环,从A[n-1]和A[n]中选出一个较小的与A[n-1]进行值交换。之后,所有的元素也就排序完了。
[问题3] 因为当i=n-1时,第二个for循环遍历的就只有A[n-1]和A[n]两个元素了,从中选出较小的那个数与A[i]值交换后被放到了最后第二位,而较大的那个数(同时也是全部元素中最大的),则自然排到了最后一位。显然已满足排序要求。
[问题4] 最佳和最坏情况下的运行时间都为Θ(n²)。因为这种直接选择排序,其关键字的比较次数与各元素原来的排列顺序无关。
2.2-3 再次考察线性查找问题(见练习2.1-3)。在平均情况下,需要检查输入序列中的多少个元素?假定待查找的元素是数组中任何一个元素的可能性是相等的。在最坏情况下又是怎么样?用Θ形式表示的话,线性查找的平均情况和最坏情况运行时间怎样?对你的答案加以说明。
答:平均情况需要查找(n-1)/2个元素;最坏情况下需要遍历完所有n个元素。
因为待查找的元素是数组中任何一个元素的可能性是相等的,即都为1/n,则可得,平均情况下的查找次数为:
(1+2+3+…+n)*(1/n) = (n-1)/2
最坏情况下可想而知是没有在该数列中找到对应的值,所以要遍历完整个数列才能确认。
用Θ形式表示都为Θ(n)。
2.2-4 应如何修该任何一个算法,才能使之具有较好的最佳运行时间?
答:在核心算法开始之前,先作一个判断:若所输入的数据已满足结果,则直接跳出算法,输出结果;反之,按正常步骤求解。