- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 问题 矩阵相乘 * n×n矩阵A和B的乘积矩阵C中的元素C[i,j]定义为: 若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i][j],需要做n次乘法和n-1次加法。因此,算出矩阵C的n2个元素所需的计算时间为O(n3) * 简单分治法求矩阵乘 首先假定n是2的幂。使用与上例类似的技术,将矩阵A,B和C中每一矩阵都分块成4个大小相等的子矩阵。由此可将方程C=AB重写为: 由此可得: 复杂度分析 T(n)=O(n3) ?没有改进? * 5.6.2? 斯特拉森分治法 P=(A11+A22)(B11+B22) Q=(A21+A22)B11 R=A11(B12-B22) S=A21(B21-B11) T=(A11+A12)B22 U=(A21-A11)(B11+B12) V=(A12-A22)(B21+B22) 为了降低时间复杂度,必须减少乘法的次数。而其关键在于计算2个2阶方阵的乘积时所用乘法次数能否少于8次。为此,Strassen提出了一种只用7次乘法运算计算2阶方阵乘积的方法(但增加了加/减法次数): * C11=P+S-T+V C12=R+T C21=Q+S C22=P+R-Q+U T(n)= ?(nlog 7)??(n2. 81) 做了这7次乘法后,在做若干次加/减法就可以得到: ?较大的改进? * 更快的方法 Hopcroft和Kerr已经证明(1971),计算2个2×2矩阵的乘积,7次乘法是必要的。因此,要想进一步改进矩阵乘法的时间复杂性,就不能再基于计算2×2矩阵的7次乘法这样的方法了。或许应当研究3×3或5×5矩阵的更好算法。 在Strassen之后又有许多算法改进了矩阵乘法的计算时间复杂性。 目前最好的计算时间上界是 O(n2.376) 是否能找到O(n2)的算法?目前为止还没有结果。 * 大整数的乘法 设计一个有效的算法,可以进行两个n位大整数的乘法运算 小学的方法:O(n2) ?效率太低 分治法: X=a2n/2+b Y=c2n/2+d XY=ac2n+(ad+bc)2n/2+bd 复杂度分析 T(n)=O(n2) ?没有改进? n/2位 n/2位 n/2位 n/2位 X= Y= A B C D * 算法改进 为了降低时间复杂度,必须减少乘法的次数。为此,我们把XY写成另外的形式: XY = ac 2n + ((a-c)(b-d)+ac+bd) 2n/2 + bd 或 XY = ac 2n + ((a+c)(b+d)-ac-bd) 2n/2 + bd 复杂性: 这两个算式看起来更复杂一些,但它们仅需要3次n/2位乘法[ac、bd和(a±c)(b±d)],于是 T(n)=O(nlog3) =O(n1.59) ?较大的改进? 细节问题:两个XY的复杂度都是O(nlog3),但考虑到a+c,b+d可能得到m+1位的结果,使问题的规模变大,故不选择第2种方案。 * 更快的方法 小学的方法:O(n2)——效率太低 分治法: O(n1.59)——较大的改进 更快的方法? 如果将大整数分成更多段,用更复杂的方式把它们组合起来,将有可能得到更优的算法。 最终的,这个思想导致了快速傅利叶变换(Fast Fourier Transform)的产生。该方法也可以看作是一个复杂的分治算法,对于大整数乘法,它能在O(nlogn)时间内解决。 是否能找到线性时间的算法?目前为止还没有结果。 * 棋盘覆盖 在一个2k×2k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 易知,覆盖任意一个2k×2k的特殊棋盘,用到的骨牌数恰好为(4k-1)/3。 * 分治策略求解 当k0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。 * 算法描述 void CB(int tr,tc,dr,dc,size) { if (size == 1) return; int t = tile++; // L型骨牌号 s = size/2; // 分割棋盘 // 覆盖左上角子棋盘 if (dr tr + s dc tc + s) // 特殊方格在此棋盘中 CB(tr, tc, dr, dc, s); else {// 此棋盘中无特殊方格 // 用 t
您可能关注的文档
最近下载
- 植物根的生长苏教版.pptx VIP
- 2026年普法学法知识竞赛题库200道【学生专用】.docx VIP
- 国家安全教育大学生读本高教2024版课件第一章完全准确领会总体国家安全观.pptx VIP
- 人工智能:模型与算法(浙江大学)中国大学MOOC(慕课)章节测验试题(答案).pdf
- 化妆品法规专业考试题目及答案.docx VIP
- 中职英语高教版(2023修订版)基础模块3三单元《Artificial+Intelligence》单词讲解课件.pptx VIP
- 2026年大学生计算机考试题库200道带答案(基础题).docx VIP
- 文化遗产教育跨学科融合课程设计探析.docx VIP
- 低代码开发师(中级)考试题库.docx VIP
- 高中历史教学中家国情怀教育的策略与评价体系教学研究课题报告.docx
文档评论(0)