加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

分治算法-最大最小值

(2014-12-05 21:26:09)
标签:

it

分类: 算法设计与分析基础

a.为一个分治算法编写伪代码,该算法同时求出一个n元数组的最大元素和最小元素的值。

b.假设n=2k,为该算法的键值比较次数建立递推关系式并求解。

c.请拿该算法与解同样问题的蛮力算法做一个比较。

解答:

 a.同时求出最大值和最小值,只需要将原数组一分为二,再使用相同的方法找出这两个部分中的最大值和最小值,然后经过比较就可以得到整个问题的最大值和最小值。

算法 MaxMin(A[l..r],Max,Min)

 //该算法利用分治技术得到数组A中的最大值和最小值

//输入:数值数组A[l..r]

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

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

else

if rl=1  //有两个元素时

if A[l]≤A[r]

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

              else

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

       else  //rl>1

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

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

if Max1Max2   Max= Max2   //从两部分的两个最大值中选择大值http://s13/bmiddle/002089xPzy6O9qjq02wfc&690

}

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/22

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];

http://s9/bmiddle/002089xPzy6O9r4Vnmw28&690

return Max,Min

}

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

算法MaxMin的时间复杂度为3n/2-2simpleMaxMin的时间复杂度为2n-2,都属于Θ(n),但比较一下发现,MaxMin的速度要比simpleMaxMin的快一些。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有