社区讨论

【卡常Tips】关于矩阵乘法的玄妙优化

P7453[THUSC 2017] 大魔法师参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo8jkxh7
此快照首次捕获于
2023/10/27 19:40
2 年前
此快照最后确认于
2023/10/27 19:40
2 年前
查看原帖
常规的矩阵乘法:
CPP
for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) //<-
			{
				for(int k=0;k<M;k++) //<-
				{
					if(!b.a[k][j]||!a.a[i][k]) continue;
					c.a[i][j]=(c.a[i][j]+1ll*a.a[i][k]*b.a[k][j]%mod)%mod;
				} 
			}
如果我们将第二层和第三层循环交换,变成:
CPP
for(int i=0;i<M;i++)
			for(int k=0;k<M;k++) //<-
			{
				if(!a.a[i][k]) continue;
				for(int j=0;j<M;j++) //<-
				{
					if(!b.a[k][j]) continue;
					c.a[i][j]=(c.a[i][j]+1ll*a.a[i][k]*b.a[k][j]%mod)%mod;
				} 
			}
可以快上许多(实测39.67s -> 27.37s )
(可能的)原因:(本人猜测)
  • 稀疏矩阵优化可以跳过更多判断的点
  • a[i][k]和b[k][j]调用连续,不需在内存中左右横跳

回复

3 条回复,欢迎继续交流。

正在加载回复...