社区讨论
【卡常Tips】关于矩阵乘法的玄妙优化
P7453[THUSC 2017] 大魔法师参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo8jkxh7
- 此快照首次捕获于
- 2023/10/27 19:40 2 年前
- 此快照最后确认于
- 2023/10/27 19:40 2 年前
常规的矩阵乘法:
CPPfor(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;
}
}
如果我们将第二层和第三层循环交换,变成:
CPPfor(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;
}
}
(可能的)原因:(本人猜测)
- 稀疏矩阵优化可以跳过更多判断的点
- a[i][k]和b[k][j]调用连续,不需在内存中左右横跳
回复
共 3 条回复,欢迎继续交流。
正在加载回复...