矩阵乘法是一种高效的算法可以把一些一维递推优化到log.docxVIP

矩阵乘法是一种高效的算法可以把一些一维递推优化到log.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
矩阵运算是属于线性代数里的一个重要内容,上学期学完后只觉得矩阵能解线性方程,不 过高屮的时候听说过矩阵能优化常系数递推以及将坐标上的点作线性变换,于是找了些资料 研究了一下,并把许多经典题以及HDU sM崽大牛总结的矩阵乘法的题日[11、辺和开设的 矩阵乘法DIY Contest给做完了,感觉收获颇丰。 一个矩阵就是一个二维数组,为了方便声明多个矩阵,我们一般会将矩阵封装一个类或 定义一个矩阵的结构体,我采用的是后者: struct Mat { long long mat [MAXN] [MAXN] ; //l澈据改int大数据加unsigned } 最特殊的矩阵应该就是单位矩阵E 了,它的对角线的元素为1,非对角线元素为Oo for (int i = 0;i MAXN; i++) E.mat[i][i] = 1; 若A为nxp矩阵,B为pxm矩阵,则它们的乘积AB(有时记做A?B)将是一个n^m矩阵。 其乘积矩阵AB的第i行第j列的元素为: n (AB)ij =刀 airbrj = a,! 6i j + 偽2场 + …+ 偽仇隔. r=l 一般矩阵乘法采用朴素的0(23)的算法: Mat operator*(Mat a,Mat b) { Mat c; memset(c.mat,9Jsizeof (Mat)); for (int i = 0;i n;i++) for (int j = 0;j n;j++) for (int k = 0;k n;k++) | | I if (a.mat[i][k] b?脱t[k][j]) c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD; return c; } 矩阵加法就是简单地将对应的位置的两个矩阵的元素相加: Mat ope「日to厂+(Mat ajMat b) { Mat c ; memse t( c.matJ0Jsizeof(Ma t)); for (in t i = 0; i n; i++) for (in t j = 0; j n; j++) j I c.mat[i] [ j ] = (a.mat[i] [ j ] + b.mat[i][j] ) % MOD; return c; 在ACM的题目中,我们一般考虑的是n阶方阵Z间的乘法以及n阶方阵与n维向量(把向 量看成nxl的矩阵)的乘法。矩阵乘法最重要的性质就是满足结合律,同时它另一个很重 要的性质就是不满足交换率,这保证了矩阵的幕运算满足快速幕啟模(AAk%MOD)算法: 假设k = 27,则k的二进制表示为11011,所以 Ak = A11O11(2) _ ^1X2° + 1X21+0X2z+23+24 =A1 X A2 X A° X A8 X A16 =A1 X (A1)2 X EX (((A1)2)2)2 X (((A1)2)2)2)2 按二进制展开,乘以相应的权值 ,可以看出:k的二进制的每一位矩阵A都要平方,在k二进制为1的位:末矩阵x平方后 的A,在k二进制为0的位则末矩阵xE (单位矩阵),即不变。代码如下: 重载按位与(乘方)和加法时注意,加法的优先级高于按位与 Mat operato「八(Mat int x)//优先级低加括号 { Mat c; c = E; for (;x;x = 1) { if (x 1) c = c * A; A = A * A; 许多题目还要求S = A+A2 + A3 + ...+a。其实再作一次二分即可:只需计算log(n)个A 的幕即可。 A + A2 + 屮 + + A5 + A6 =(A + A? + A3)x(^4-A3)将二分 若A中=m表示从i到j有m条有向边,则A”中=n表示从i经过k条有向边到达j,这 样的走法有n种 Mat Mat { sum ( int x)//aai+aa2+...+aax if (x == 1) return A; if (x 1) return (AAx)+sum(x-l); return sum(x/2)*((AA(x/2))+E); 矩阵在ACM里用处最大的就是加速常系数递推方程的计算,最经典的例子就是Fibonacci 数列,如果普通的递推,计算笫n项复杂度为o(n),显然对于10人9左右的数据就力不从心 了。如果用矩阵快速幕递推的话,计算第n项的复杂度为o卅*log(n)),对应一般的题目已 经绰绰有余了,有的题目可以根据矩阵的特殊性进行优化,可以达到o(Z:2*log(n))o 由f =a f +b f 常系数递推式右边有两项,所以向量和矩阵的规格都为2o容 J n J /?-! J n-2 实现计算Fibonacci数列第k项的代 码 如

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档