稀疏矩陣:非零元多,在矩陣中隨機出現
假設 m 行 n 列的矩陣含 t 個非零元素,則稱
δ=t/(m*n)
為稀疏因子。 通常認為 δ<= 0.05 的矩陣為稀疏矩陣。
常規存儲方法缺點:
1) 零值元素占了很大空間;
2) 計算中進行了很多和零值的運算,遇除法, 還需判別除數是否為零。
稀疏矩陣的壓縮存儲方法:
一 、三元組順序表
二、行邏輯聯接的順序表
三、 十字鏈表
一 、三元組順序表
•采用一維數組以行為主序存放每一非零元;
•每一非零元只存行號、列號、非零元的值;
如何求轉置矩陣?
- 根據三元組順序表的特點, 首先掃描一遍三元素,將掃 描到的列號為1的非0元行列 交換存放於轉置后的新陣, 生成新陣第一行的非0元;
- 再掃描一遍三元素,將掃描 到的列號為2的非0元行列交 換存放於轉置后的新陣,生 成新陣第二行的非0元;
- ……
方法1:將矩陣M轉置成矩陣T
方法2:減少原陣的掃描次數,提高時間效率
- Num[col]:存放矩陣T中每一行非零元的個數
- Cpot[col]:存放矩陣T中每一行非零元的當前存放的位置
所謂“位置” ,即在三元組中存放的數組 元素的下標
cpot[1] = 1;
for (col=2; col<=M.nu; ++col)
cpot[col] = cpot[col-1] + num[col-1];
1 #define ElemType int 2 #define MAXSIZE 12500 3 typedef struct{ 4 int j,i; //該非零元的行下標和列下標 5 ElemType e; // 該非零元的值 6 7 }Triple; // 三元組類型 8 9 typedef struct{ 10 Triple data[MAXSIZE+1]; 11 int mu,nu,tu; 12 13 }TSMatrix; // 稀疏矩陣類型 14 15 //方法1:將矩陣M轉置成矩陣T 16 status TranspostSMatrix(TSMatrix M,TSmatrix $T){ 17 T.mu=M.nu; 18 T.nu=M.mu; 19 T.tu=M.tu; 20 if(T.tu){ 21 q=1; 22 //M.data[p]是在第一個元素開始存的M.data[0]空出來 23 for(col=1;col<=M.nu;++col) 24 for(p=1;p<=M.tu;++p){ 25 if(M.data[p].j==col){ 26 T.data[q].i=M.data[p].j; 27 T.data[q].j=M.data[p]=i; 28 T.data[q].e=M.data[p].e; 29 q++; 30 } 31 } 32 33 } 34 return 0; 35 } 36 37 38 //方法2:減少原陣的掃描次數,提高時間效率 39 status FastTransposeSMatrix(TSMtrix M,TSMatrix &T){ 40 T.mu=M.nu; 41 T.nu=M.mu; 42 T.tu=M.tu; 43 if(T.tu){ 44 for(col=1;col<=M.nu;++col) 45 num[col]=0; 46 for(t=1;t<=M.tu;++t) 47 ++num[M.data[t].j]; 48 49 cpot[1] = 1; 50 for (col=2; col<=M.nu; ++col) 51 cpot[col] = cpot[col-1] + num[col-1]; 52 //減少原陣的掃描次數,提高時間效率 53 for(p=1;p<=M.tu;++p){ 54 col=M.data[p].j; 55 q=cpot[col]; 56 T.data[q].i=M.data[p].j; 57 T.data[q].j = M.data[p].i; 58 T.data[q].e = M.data[p].e; 59 ++cpot[col] 60 } 61 } 62 return o; 63 }
方法一:時間復雜度為: O(M.nu*M.tu)
方法二:時間復雜度為: O(M.nu+M.tu)