• 三元组(C++ 实现矩阵快速转置)


      三元组稀疏矩阵是一种高效存储稀疏矩阵的方法。它通过记录矩阵中非零元素的行、列和值来表示一个稀疏矩阵。我们在三元组里存储的是每个元素的行、列以及值。

    题目:

      任意输入一个稀疏矩阵M,用三元组顺序表压缩存储该稀疏矩阵M,然后求其转置矩阵T,并输出转置矩阵T。

    思路: 

    1、这里运用了快速转置,降低时间复杂度

    2、快速转置的核心是确定转置后矩阵,每行的第一个非零元在三元表中的序号

    3、详细在代码注释中

    代码:

    1. #include
    2. using namespace std;
    3. typedef struct node
    4. {
    5. int i, j, e;
    6. }Triple;
    7. typedef struct node1
    8. {
    9. node data[1000];
    10. int mu, nu, tu=0;//矩阵行数、列数、非零元个数
    11. }TSMatrix;
    12. void Transpose(TSMatrix m, TSMatrix& t)
    13. {
    14. int num[100]={0}, head[100];
    15. t.mu = m.nu, t.nu = m.mu, t.tu = m.tu;
    16. if (t.tu)//非零元不为0个,则做下列操作
    17. {
    18. for (int i = 1; i <= t.mu; i++)//逆置矩阵的列变行,初始每行中的非零元个数为0
    19. num[i] = 0;
    20. for (int i = 1; i <= t.tu; i++)//遍历非零元
    21. num[m.data[i].j]++;//列变行,m中每列的非零元个数就是t中每列非零元的个数
    22. head[1] = 1;
    23. for (int i = 2; i <= t.mu; i++)//遍历t的行数
    24. head[i] = head[i - 1] + num[i-1];//每行的第一个非零元在三元表中的序号
    25. for (int i = 1; i <= t.tu; i++)//遍历非零元
    26. {
    27. int col = m.data[i].j;//取非零元的列数
    28. int l = head[col];//该列要存储的位置
    29. t.data[l].i = m.data[i].j, t.data[l].j = m.data[i].i;//行转列,列转行
    30. t.data[l].e = m.data[i].e;
    31. head[col]++;//该列元素下次存储往下一位
    32. }
    33. }
    34. }
    35. int main()
    36. {
    37. TSMatrix m,t;
    38. int ju[51][51];
    39. cout << "输入行数,列数:" << endl;
    40. cin >>m.mu >> m.nu;
    41. for (int i = 1; i <= m.mu; i++)//输入初始矩阵,建立三元组
    42. for (int j = 1; j <= m.nu; j++)
    43. {
    44. cin >> ju[i][j];
    45. if (ju[i][j] != 0)
    46. {
    47. m.tu++;
    48. m.data[m.tu].e = ju[i][j];
    49. m.data[m.tu].i = i, m.data[m.tu].j = j;
    50. }
    51. }
    52. Transpose(m, t);
    53. //for (int i = 1; i <= m.tu; i++)
    54. //cout << m.data[i].e << " " << m.data[i].i << " " << m.data[i].j << endl;
    55. //cout << endl;
    56. //for (int i = 1; i <= t.tu; i++)
    57. //cout << t.data[i].e << " " << t.data[i].i << " " << t.data[i].j << endl;
    58. cout << "逆置后矩阵:" << endl;
    59. int k = 1;
    60. for (int i = 1; i <= t.mu; i++)
    61. {
    62. for (int j = 1; j <= t.nu; j++)
    63. {
    64. if (t.data[k].i == i && t.data[k].j == j)
    65. cout << t.data[k++].e << " ";
    66. else
    67. cout << "0 ";
    68. }
    69. cout << endl;
    70. }
    71. }

  • 相关阅读:
    redis常用查询操作
    Qt 项目实战 | 多界面文本编辑器
    【最新计算机毕业设计】ssm基于微信小程序的校园商铺系统
    Navicat连接报2059异常
    【C++项目】高并发内存池第四讲 申请内存过程介绍流程介绍
    算法通关村-----归并排序
    Kubernetes 中 RBAC、ServiceAccount 的区别和联系
    美团组件化事件总线方案改进:ModularEventBus
    第一章:为什么要并行计算
    vue常见的指令
  • 原文地址:https://blog.csdn.net/qq_74156152/article/details/133873595