分治法求最大值最小值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分治法求最大值最小值
a.为一个分治算法编写伪代码,该算法同时求出一个n元数组的最大元素和最小元素的值。
b.假设n=2k,为该算法的键值比较次数建立递推关系式并求解。
c.请拿该算法与解同样问题的蛮力算法做一个比较。
解答:
a.同时求出原数组最大值和最小值,先将原数组一分为二,再找出划分的两个部分的最值,然后再合并最值,找划分的两个部分的最值就递归地在这两个部分中用同样的方法找最大值和最小值,然后只需要给出最小规模的确切解法作为递归出口就可以了。
算法MaxMin(A[f…l],Max,Min)
//该算法利用分治法求得数组A中的最大值和最小值
//输入:数值数组A[f..l]
//输出:最大值Max和最小值Min
if l−f=0 //只有一个元素时
Max←A[f];Min←A[f];
else
if l-f=1 //有两个元素时
if A[f]>A[l] //基本操作是作比较
Max←A[f] ,Min←A[l]
else Max←A[l] ,Min←A[f]
else //有大于两个元素时
MaxMin(A
[f…(f+l
2)]
,Max1,Min1);//递归解决前一部分
MaxMin(A
[(f+l
2)…l]
,Max2,Min2); //递归解决后一部分
Max←max {Max1,Max2};//从两部分的两个最大值中选择大值
Min←min {Min1,Min2};//从两部分的两个最小值中选择小值 return Max,Min;
b.假设n=2k,比较次数的递推关系式:
C(n)=2C(n
2
)+2 ,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
=23C(2k-3)+23+22+2
...
=2k-1C(2)+2k-1+2k-2+...+2 //C(2)=2 =2k-1+2k-1+2k-2+...+2 //等比数列求和
=2k-1+2k-2 //2k=n, 2k-1=n
2
=3n
−2
2
b.蛮力法的算法如下:
算法ForceMaxMin(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]<Min
Min←A[i]
return Max,Min
c.作比较
ForceMaxMin的时间复杂度T(n)=2n−2
算法MaxMin的时间复杂度为3n
−2,ForceMaxMin的时间复杂度为2n-2,都属于Θ(n),
2
但MaxMin的速度要比ForceMaxMin的稍快一点。