1. 程式人生 > 實用技巧 >稀疏矩陣

稀疏矩陣

 /*
思路:將稀疏矩陣a轉置為b,先掃描一遍a三元表(行列值),
獲得a各列元素個數->得到b各行元素個數->知道a各元素在b中的插入位置->再掃描一遍a即可
T(n)=O(Cols+Terms);
*/
1
const int MaxTerms = 100; 2 class SparseMatrix 3 {public: 4 SparseMatrix FastTranspose(); 5 SparseMatrix Add(SparseMatrix b); 6 SparseMatrix Multiply(SparseMatrix b); 7 private
: 8 int Rows, Cols, Terms;//矩陣的行數 列數 非零項數 9 MatrixTerm smArray[MaxTerms]; 10 }; 11 class MatrixTerm 12 { 13 friend SparseMatrix; 14 private: 15 int row, col, value;//非零項的位置和值。三元錶行優先 16 }; 17 //稀疏矩陣快速轉置 18 SparseMatrix SparseMatrix::FastTranspose()//將矩陣a(自身)轉置為b 19 { 20 int* RowSize = new
int[Cols];//下標為行 21 int* RowStart = new int[Cols]; 22 SparseMatrix b; 23 b.Rows = Cols;b.Cols = Rows;b.Terms = Terms; 24 if (Terms > 0) 25 { 26 for (int i = 0;i < Cols;++i) 27 RowSize[i] = 0; 28 for (int i = 0;i < Cols;++i) 29 RowSize[smArray[i].Cols]++;
30 RowStart[0] = 0; 31 for (int i = 1;i < Cols;++i) 32 RowStart[i] = RowStart[i - 1] + RowSize[i - 1];//RowStart目前存放矩陣b各行元素起始位置 33 for (int i = 1;i < Terms;++i) 34 { 35 int j = RowStart[smArray[i].col];//smArray[i]在b三元表中的位置j 36 b.smArray[j].row = smArray[i].col; 37 b.smArray[j].col= smArray[i].row; 38 b.smArray[j].value = smArray[i].value; 39 RowStart[smArray[i].col]++;//RowStart存放本行下一個元素進來的位置 40 }; 41 }; 42 delete[]RowSize; delete[] RowStart; 43 return b; 44 };