- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计与分析_10算法设计-分治法
算法设计与分析演示稿 纪玉波制作(C) 算法设计与分析 ——分治法 * * 分治法(divide-and-conquer) 分治策略是一种用得最多的一种有效方法,它的基本思想将问题分解成若干子问题,然后求解子问题。子问题较原问题无疑是要容易些,由此得出原问题的解,就是所谓的“分而治之”的意思。分治策略还可以递归进行,即子问题仍然可以用分治策略来处理,最后的问题是非常基本而简单。下面举几个例子。 1.合并排序 合并算法排序即属于分治方法。合并(Merge)就是将两个或多个有序表合并成一个有序表,例如下图所示的两个有序表经合并运算后得到一个有序表。我们在此只用到两个有序表的合并,称为二路并〔Two-way merge)。 合并排序(Merge sort)就是利用这种合并过程进行排序,即先将n个数据看成n个长度为l的表,将相邻的表成对合并,得到长度为2的n/2个有序表;进一步再将相邻表成对会并,得到长度为4的n/4个有序表;……;如此重复做下去,直至所有数据均合并到一个长度为n的有序表为止,即完成排序。上述每一次的合并过程称为一趟〔Pass),整个排序过程叫二路合并排序。下图是二路合并排序过程的一个例子。 [7] [15] [13] [10] [4] [20] [19] [8] [7] [15] [10] [13] [4] [20] [8] [19] [7] [10] [13] [15] [4] [8] [19] [20] [4] [7] [8] [10] [13] [15] [19] [20] 对于二路合并,如果数据个数n是2的整数次方,则所需的趟数为logn,例如n=8,logn=3,故共需三趟合并过程。如果n不是2的整数次方,则在每趟合并时表的数目不一定总是偶数个。若表的数目为奇数,就剩下一个表要“轮空”,直接进入下一趟。这样,下一趟合并时此表的长度与其它的表将不相同,因此我们设计的合并过程,并不要求待合并的两个表长度必须相同。 二路合并排序的时间复杂性为O(nlogn),与堆排序及快速排序平均情况的时间复杂性同样数量级。 2.在互不相同的n个数{x1, x2,…, xn}中,找出最大和最小的数。 若用普通的算法为: begin xmax←x1;xmin←x1 for i=2 to n do begin if xmaxxi then xmax←xi if xminxi then xmin←xi end end 此算法的比较次数为2(n-1)=2n-2,显然不是最优的。如果用分治法解决法,写出递归过程为: 过程MAXMIN(x1, x2,…, xn) (1)如n=1,则xmax←x1, xmin←x1 (2)如n=2,则比较x1与x2,令大者为xmax,小者为xmin (3)如n2,则 调用MAXMIN(x1, …, x[n/2]) 调用MAXMIN(x[n/2]+1,…, xn) 比较两个最大值,令大者为xmax 比较两个最小值,令小者为xmin。 下面分析用此算法的比较次数。设T(n)表示元素个数为n时的总比较次数,则 T(1)=0,T(2)=1 (n2) 为方便起见,设n=2r,问题的逐层划分如下表所示: 可以证明 T(n)=3n/2-2 此值恰好等于问题的下界,故这是最优算法。 其实,此问题也不一定要用递归算法来解决,可将数据分成两个一组的n/2组,第一组比较一数,令大的为xmax,小的为xmin,以后各组比较三次,先两个数据比较,其中大者再与xmax比,小者再与xmin比,总比较次数也恰为 。 3. 两数相乘 我们研究两个n位二进制数相乘的问题。假设两个一位数相乘,两个一位数相加和任何数移位一步所需运算时间均为O(1),即均为常数。用普通的方法运算,将乘数的每一位(由低位至高位)逐个去乘被乘数,每乘一次将成积与原来的积相加,然后乘数和乘积移位一步,如此下去直至乘数的最高位运算完即得出结果,这样运算共需n2 次一位乘一位运算,n(n-1)次一位加一位运算和n次移位,总运算复杂性为O(n2)。 现在用分治法来做。设n=2r,将两个数都按位数划分成两段,如图所示, 这需要三次n位的加法,一次n步移位,一次n/2步移位和四次n/2位的乘法。 设用分治法做两个n位数乘法的复杂性为T(n),因加法和移位都是O(n),故 这样并没有显出其优越性,我们可以将其进一步改进,增加一些加法运算以减少乘法运算。 上式的4次乘法可以由3次完成。
文档评论(0)