2.2-1 用Θ形式表示函数n³/1000-100n²-100n+3。
答:Θ(n³)
=========================================================================================
2.2-2:考虑对数组A中的n个数进行排序的问题:首先找出A中的最小元素,并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素,并将其与A[2]中的元素进行交换。对A中头n-1个元素继续这一过程。写出这个算法的伪代码,该算法称为选择排序(selection sort)。对这个算法来说,循环不变式是什么?为什么它仅需要在头n-1个元素上运行,而不是在所有n个元素上运行?以Θ形式写出选择排序的最佳和最坏情况下的运行时间。
(2.2-2 Consider sorting n numbers stored in array A by first finding the smallest element of A and exchanging it with the element in A[1]. Then find the second smallest element of A, and exchange it with A[2]. Continue in this manner for the first n-1 elements of A. Write pseudocode for this algorithm, which is known as selection sort. What loop invariant does this algorithm maintain? Why does it need to run for only the first n -1 elements, rather than for all n elements? Give the best-case and worst-case running times of selection sort in Θ-notation.)
伪代码
SELECTION_SORT(A)
// 数组是1开始的。
for i=1 to n-1
key = A[i]
for j = i+1 to n // 找最小元素
if key > A[j]
key = A[j]
// 交换 key 和 A[i] 的值
A[j] = A[i]
A[i] = key
循环不变式:
初始化:此时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]进行值交换。之后,所有的元素也就排序完了。
每一步的时间消耗如下:
说明:
第1步,(n-1 次进入循环, 1次判断要退出循环)
第3步,当i=1时,从2循环到n,n-1次进入循环,1次判断是否要退出循环,即 n次; 当i=2时,从3循环到n,n-2次进入循环,1次判断是否要退出循环,即 n-1次。
第4步,只需要判断循环里面的,所以每次循环比第3步少1个。
第5步,取平均值,假设只有一半。
计算总时间消耗:
算术级数就是等差数列; 几何级数就是等比数列 ; 算术级数中任意连续两项的差相同,这个差值叫做这个算术级数的公差; 算术级数前n项的和:(首项+末项)*(项数n)/2; 第n项:首项+公差*(n-1);
即: n + (n-1) + (n-2)+ ...+ 1 = (n+1)*n/2
(n-1) + (n-2)+ ...+ 1 = (n)*(n-1)/2
n + n -1+ (n+1)*n/2 + (n)*(n-1)/2 +(n)*(n-1)/4 + n -1 + n -1 = 5/4*n^2+15/4*n-3 = Θ(n^2)
上面的时间是平均情况,而不是最好和最坏的情况
最坏的情况是上面伪代码的第5步需要全部执行,第5步的时间即为 :(n-1) + (n-2)+ ...+ 1
最好的情况是上面伪代码的第5、6、7步均不需要执行。
从上面可以看到,不论是最好还是最坏情况,执行的时间均是Θ(n^2)。
=========================================================================================
2.2-3 再次考察线性查找问题(见练习2.1-3)。在平均情况下,需要检查输入序列中的多少个元素?假定待查找的元素是数组中任何一个元素的可能性是相等的。在最坏情况下又是怎么样?用Θ形式表示的话,线性查找的平均情况和最坏情况运行时间怎样?对你的答案加以说明。
2.1-3的试题如下:考虑下面的查找问题:
输入:一列数A=<a1,a2,…,an >和一个值v
输出:下标i,使得v=A[i],或者当v不在A中出现时为NIL。
写出针对这个问题的现行查找的伪代码,它顺序地扫描整个序列以查找v。
利用循环不变式证明算法的正确性。确保所给出的循环不变式满足三个必要的性质。
每一步执行时间分析:
最坏情况,第2步判断需要找到最后一个发现也没有,即总花费时间 2n+2 = Θ(n)
最好情况,第2步第一个就是。即花费时间是 n+3 = Θ(n)
平均情况,第2步执行到一半, 即花费时间是 3/2*n+2 = Θ(n)
===========================================================================================
2.2-4 应如何修该任何一个算法,才能使之具有较好的最佳运行时间?
答:在核心算法开始之前,先作一个判断:若所输入的数据已满足结果,则直接跳出算法,输出结果;反之,按正常步骤求解。
另外一个解答:
我们可以首先设计一个针对该问题的一个特定输入,使得这个特定输入是最好的情况,然后不断修改算法,使其针对该特列的运行时间达到最佳
参考资料:
https://github.com/Airead/excise/blob/master/algorithms/excise/2.2-2.txt
http://www.cnblogs.com/timebug/archive/2010/03/10/1682880.html
http://www.cnblogs.com/liao-xiao-chao/articles/2351925.html
http://qiemengdao.iteye.com/blog/1328678
http://www.cnblogs.com/sinoxavier/archive/2012/11/23/2785077.html
http://fongfc.files.wordpress.com/2009/10/alg_sol_ch_2.pdf