算法设计与分析基础习题参考答案 下载本文

习题4.1 1.a.为一个分治算法编写伪代码,该算法求一个n个元素数组中最大元素的位置. b.如果数组中的若干个元素都具有最大值,该算法的输出是怎样的呢? c.建立该算法的键值比较次数的递推关系式并求解. d.请拿该算法与解同样问题的蛮力算法做一个比较 解:a. Algorithms MaxIndex(A[l..r]){ Input:A portion of array A[0..n-1] between indices l and r(l≤r) Output: The index of the largest element in A[l..r] if l=r return l else temp1←MaxIndex(A[l..(l+r)/2]) temp2←MaxIndex(A[(l+r)/2..r]) if A[temp1]≥A[temp2] return temp1 else return temp2 } b.返回数组中位于最左边的最大元素的序号. c.键值比较次数的递推关系式: C(n)=C( n/2 )+C( n/2 )+1 for n>1 C(1)=0 设n=2k,C(2k)=2C(2k-1)+1 =2[2 C(2k-2)+1]+1=22C(2k-2)+2+1 =2[22C(2k-3)+1]+2+1=23C(2k-3)+ 22+2+1 =... =2iC(2k-i)+ 2i-1+2 i-2 +...+2+1 =... =2kC(2k-k)+ 2k-1+2 k-2 +...+2+1=2k-1=n-1 可以证明C(n)=n-1对所有n>1的情况都成立(n是偶数或奇数) d.比较的次数相同,但蛮力算法不用递归调用。 2、a.为一个分治算法编写伪代码,该算法同时求出一个n元数组的最大元素和最小元素的值。 b.请拿该算法与解同样问题的蛮力算法做一个比较。 c.请拿该算法与解同样问题的蛮力算法做一个比较。 解答: a.同时求出最大值和最小值,只需要将原数组一分为二,再使用相同的方法找出这两个部分中的最大值和最小值,然后经过比较就可以得到整个问题的最大值和最小值。 算法 MaxMin(A[l..r],Max,Min) //该算法利用分治技术得到数组A中的最大值和最小值 //输入:数值数组A[l..r]

13

//输出:最大值Max和最小值Min

if(r=l) Max←A[l];Min←A[l]; //只有一个元素时 else

if r-l=1 //有两个元素时

if A[l]≤A[r]

Max←A[r]; Min←A[l]

else

Max←A[l]; Min←A[r]

else //r-l>1

MaxMin(A[l,(l+r)/2],Max1,Min1); //递归解决前一部分 MaxMin(A[(l+r/)2..r],Max2,Min2); //递归解决后一部分

if Max1<Max2 Max= Max2 //从两部分的两个最大值中选择大值 if Min2

}

b.假设n=2k,比较次数的递推关系式:

C(n)=2C(n/2)+2 for n>2 C(1)=0, C(2)=1

C(n)=C(2k)=2C(2k-1)+2 =2[2C(2k-2)+2]+2 =22C(2k-2)+22+2

=22[2C(2k-3)+2]+22+2 =23C(2k-3)+23+22+2 ...

=2k-1C(2)+2k-1+2k-2+...+2 //C(2)=1

=2k-1+2k-1+2k-2+...+2 //后面部分为等比数列求和 =2k-1+2k-2 //2(k-1)=n/2,2k=n =n/2+n-2 =3n/2-2

b.蛮力法的算法如下: 算法 simpleMaxMin(A[l..r])

//用蛮力法得到数组A的最大值和最小值 //输入:数值数组A[l..r]

//输出:最大值Max和最小值Min Max=Min=A[l]; for i=l+1 to r do

if A[i]>Max Max←A[i]; else if A[i]

时间复杂度t(n)=2(n-1)

算法MaxMin的时间复杂度为3n/2-2,simpleMaxMin的时间复杂度为2n-2,都属于Θ(n),但比较一下发现,MaxMin的速度要比simpleMaxMin的快一些。 6.应用合并排序对序列E,X,A,M,P,L,E按字母顺序排序.

14

1 2 3 8.a.对合并排序的最差键值比较次数的递推关系式求解.(for n=2k) b.建立合并排序的最优键值比较次数的递推关系式求解.(for n=2k) c.对于4.1节给出的合并排序算法,建立它的键值移动次数的递推关系式.考虑了该算法的键值移动次数之后,是否会影响它的效率类型呢? 解: a. 递推关系式见4.1节. b. 最好情况(列表升序或降序)下: Cbest(n)=2Cbest(n/2)+n/2 for n>1 (n=2k) Cbest(1)=0 15

c. 键值比较次数M(n)

M(n)=2M(n)+2n for n>1 M(1)=0 习题4.2

1.应用快速排序对序列E,X,A,M,P,L,E按字母顺序排序

16