- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
§2.4分而治之法
§2.4 分而治之法 在封建国家中,君主为了有效地统治国家,往往使用分而治之的方法, 就是将国土分成几个部分,对每一部分国土,君主派一个诸侯去管理, 国君自己就不直接过问这部分国土的事情了。 国君的工作就是将一个国家分成几个部分,委派诸侯,过问诸侯工作的结果。 在计算机科学中,这种思想得到借鉴。 分而治之算法的思路是这样的,把一个大小为n的问题实例分解成若干个大小较小的实例, 再分别解决这些较小的实例,然后由这些小实例的解构造出整个问题实例的解。 第一章讨论过的河内塔问题,归并排序问题的解算都是分而治之法的例子。 下面以赛程问题及整数乘法问题来说明分而治之法的思路。 赛程问题: 有N个运动员进行单循环赛,即每个运动员要和所有其他运动员进行一次比赛。 试为这N个运动员安排比赛日程。 要求每个运动员每天只进行一场比赛, 且整个赛程在N -1天内结束。 将运动员从1到N编号。 问题的输入为N: 参赛运动员人数; 输出是N阶方阵: int A[N][N] 其中第一列是下述向量的转置矩阵 (1,2,···,N) 当J0时,A[I][J]表示第I名运动员在第J天的比赛对手。对A矩阵有如下要求: (i) A矩阵每一行不含相同的元素,即一行中的元素各不相同,这是因为每一个运动员要和所有其他运动员比赛一次. (ii) 每列不含相同的元素,因为每名运动员每天只赛一场。 (iii) 如A[I ][ J]=K,则A[K ][ J]=I这是因为运动员I在第J天对手为运动员K,则当然运动员K在同一天的比赛对手为I 首先要指出,问题可能无解,如N=3.第一位选手第一天的对手必然是2或3中的一个。因此有如下结果. 当N为2的整次幂时,问题有解,当然解是不唯一的。 解决的思路是这样的。将运动员分成两组, 编号分别为 1,2,···,N/2; N/2+1,N/2+2,…N 为第一组运动员安排日程,得到N/2阶的方阵A1; 为第二组运动员安排日程,得到另一个N/2阶的方阵A2, 整个解为N阶方阵(如下图) 即A矩阵由4个子矩阵组成,其左上、右下为A1,其左下、右上为A2. 当然矩阵A1和A2都满足三个条件。现在证明由A1,A2拼装得到的矩阵A也满足这三个条件。 先证矩阵A满足条件(i), 因A1矩阵满足条件(i) 则A1矩阵的每一行是 1,2,… , N/2 的一个排列;同理A2矩阵的每一行是 N/2+1,N/2+2,…N 的一个排列。A矩阵的每一行由A1的一行和A2的一行联接组成,因此A矩阵的一行是 1,2,···,N 的一个排列,从而A矩阵的每一行都不含有相同的元素。同理可证矩阵A满足条件(ii)。 下面证明矩阵A满足条件(iii)。即要证明如果 A[l ][ J]=K 则 A[K ][ J]=I 当1JN/2时,显然成立,因为这些值I,J,K都在左上的A1内部,或都在左下的A2内部。 现考虑,J=N/2的情况。 令1≤I≤N/2(当N/2 I≤N时同样可以证明)。 我们须证圆圈处的值A[K][J]=I A[I ][ J]=A[I+N/2 ][ J-N/2]=K (1) A[K ][ 1]=K (2) A[K ][ J]=A[K-N/2 ][ J-N/2] (11) A[I+N/2 ][ J-N/2]=A[K ][ 1]=K (由1, 2) A[K ][ J-N/2]=A[I+N/2 ][ 1]=I+N/2(iii,两个*) 两个O号处的值也应相等,此即 A[K-N/2 ][ J-N/2]=A[I ][ 1] 由于(11)式,从而 A[K ][ J]=A[I ][ 1]=I 证毕。 为运动员安排日程表的函数为 arrangement (int N) 当N=2时,过程只执行四个赋值语句; 当N2时过程要执行调用arrangement两次, 然后再执行两个嵌套两次的FOR语句,FOR语句的循环体是赋值语句。 设这个赋值语句所需时间为c2 ,在N=2时的四个赋值语句所需时间为c1. T(2)= c1 T(n)=2T(n/2)十c2(n/2)2,n2 用第一章的技术可以解得 T(n)= C2n2-2C2n+C1n/2 =O(n2 ) 整数乘法问题: 设A
文档评论(0)