【数据结构梳理03】数组的应用——三元组存储稀疏矩阵

一、稀疏矩阵的类定义(使用三元组储存)

struct MatrixTerm{
  int row;
  int col;
  int value;
  MatrixTerm(int r=-1,int c=-1,int val=-1):row(r),col(c),value(val) { }
};

class Matrix{
public:
  Matrix();
  ~Matrix();
  FastTranspose();
private:
  int rows;
  int cols;
  int terms;
  int capacity;
  MatrixTerm* smArray;
};

二、稀疏矩阵的快速转置

用三元族存储的稀疏矩阵在转置时,如果仅仅使用普通的转置法,即多次遍历smArray[],将矩阵中各元素按照列号的大小排列(因为行号已经是有序的),那么时间复杂度可以达到O(cols*terms)。所以我们采用如下的快速转置法来对矩阵进行转置,可以将时间复杂度降至O(terms+cols)。

Matrix Matrix::FastTranspose ( ){
  Matrix b(cols, rows, terms);
  if (terms > 0){
    int *rowSize = new int[cols];
    int *rowStart = new int[cols];
    fill(rowSize, rowSize + cols, 0);
    for (int i=0; i<terms; i++ ) 
      rowSize[smArray[i].col]++;
    rowStart[0] = 0;
    for (int i=1;i<cols;i++) 
      rowStart[i]=rowStart[i-1]+rowSize[i-1];
    for (int i=0; i<terms; i++){ 
      int j = rowStart[smArray[i].col];
      b.smArray[j].row = smArray[i].col;
      b.smArray[j].col = smArray[i].row;
      b.smArray[j].value = smArray[i].value;
      rowStart[smArray[i].col]++;
    }
    delete [ ] rowSize;
    delete [ ] rowStart;
  } 
  return b;
}

 

图解:

posted @ 2021-12-02 09:32  天涯海角寻天涯  阅读(599)  评论(0)    收藏  举报