- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机算法治与递归
二、递归算法 Strassen算法 斯特拉森(Strassen)发现了在分治设计的基础上使用一种减少乘法次数而让加减法次数相应增加的处理方法来计算*式中的Cij。其中处理方法是,先用七个乘法和十个加(减)法来算出下面七个(n/2)*(n/2)造成矩阵。(见下页算法) 值得注意的是: 斯特拉森矩阵乘法目前还只具有理论意义,因为只有当n相当大时它才优于通常的矩阵乘法。经验表明,当n取为120时,斯特拉森矩阵乘法与通常的矩阵乘法在计算时间上仍无显著的差别。 1、递推算法求递归 用递归算法时,只要输入的n值稍大,程序求解就很困难,而用递推算法,则效率高很多 很多递归问题可用递推算法实现,如阶乘、Fibonacci数列等。它们的相邻数之间有着明显的规律性的变化 通常可以将递归结束的条件作为递推的初始条件,并利用这种规律性一步一步递推到结果。这种递推通常采用循环迭代的方法,如循环累乘、循环累加等。 2、递推算法求Fibonacci数列 3、分治算法设计模式 (5) IF k ? ?s1? THEN RETURN(select( k, s1, ?s1?) ) ELSE IF k ? ?s1? + ?s2? THEN RETURN(m) ELSE RETURN (select( k - ?s1? - ?s2?, s3, ?s3?) ) ] ENDF; M: 小 大 大 小 T(n) ? T( n) + T( n) + cn (n 5) 5 1 4 3 cn (n ? 5) (设:r = 5) 解: 令:a = 1/5, b = 3/4 有: T(n) ? T(an) + T(bn) + cn ? [ T(a2n) + T(abn) + c an ] + [ T(abn) + T(b2n) +c bn ] + cn ? T(a2n) + 2T(abn) + T(b2n) + (a + b)cn + cn ? T(a3n) + 3T(a2bn) + 3T(ab2n) + T(b3n) + (a + b)2 cn + (a + b) cn + cn ? ?????? ? T(amn) + ( )T(am-1bn) + ( )T(am-2b2n) + ( )T(am-kbkn) + ??? +T(bmn) + (a + b)m-1cn +(a + b)m-2cn + ??? +(a + b)cn + cn m 1 m 2 m k 因为:0ab1, ?amam-1b ??? am-k bk ??? bm 对于T(bmn),当 m ? log2 5 log2 b ?log2 b? log2 n + 时,bmn ? 5成立 ?T(bmn) ? bmcn T(n) ? (a + b)mcn + (a +b)m-1cn + ??? + (a + b) cn + cn ? ?(a + b)k cn ? k=0 m 1 - (a + b)m+1 1 - (a + b) cn ? cn 1 - (a + b) 1 ? 20 cn 棋盘覆盖 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 棋盘覆盖 当k0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。 特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。 棋盘覆盖 void chessBoard(int tr, int tc, int dr
文档评论(0)