三元组存矩阵

矩阵转置

三元组形式

struct Node {
    int r, c, val;  // 行、列、值
};

存矩阵三元组的三元组是有序的,按r值递增,再按c值递增。

如何更好地保证转置后的矩阵依然有序?

一个显然的做法是先全部转置,再排序,复杂度大概O(nlogn)

还有一个O(n)的做法:

使用数组cnt[],使得cnt[i]表示转置前的三元组的 c==iNode的数量。复杂度O(n)

再使用数组pos[],使得 pos[i] 表示转置前的三元组的 c==iNode 应该在转置后的三元组的位置。复杂度O(n)

这样就可以在O(n)的时间内完成。

int n;
vector<Node> OLD(n),NEW(n);
vector<int> cnt(n),pos(n);

// 求cnt
for (int i = 0;i < n;i++) {
    cnt[OLD[i].c]++;
}
// 求pos
pos[0] = 0;
for (int i = 1;i < n;i++) {
    pos[i] = pos[i - 1] + cnt[i - 1];
}
// 求NEW
for (int i = 0;i < n;i++) {
    swap(OLD[i].r, OLD[i].c);
    NEW[pos[OLD[i].r]] = OLD[i];
    pos[OLD[i].r]++;
}

矩阵相乘

给出俩个有序的三元组矩阵AB,求相乘后的矩阵C

A的每一个值x,在B中找到每一个y,使得 x.c=y.r ,然后值相乘。

如果C中没有r==x.rc==y.c的节点,就将{x.r,y.c,x.valy.val}放入C中。

否则,将这个节点的值再加x.valy.val

posted @   Uzhia  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示