稀疏矩陣的壓縮存儲方法


稀疏矩陣:非零元多,在矩陣中隨機出現

假設 m 行 n 列的矩陣含 t 個非零元素,則稱

δ=t/(m*n)

為稀疏因子。 通常認為 δ<= 0.05 的矩陣為稀疏矩陣。

常規存儲方法缺點:

  1) 零值元素占了很大空間;

  2) 計算中進行了很多和零值的運算,遇除法, 還需判別除數是否為零。

 

稀疏矩陣的壓縮存儲方法:

一 、三元組順序表

二、行邏輯聯接的順序表

三、 十字鏈表

 

一 、三元組順序表

•采用一維數組以行為主序存放每一非零元;

•每一非零元只存行號、列號、非零元的值;

如何求轉置矩陣?

  1. 根據三元組順序表的特點, 首先掃描一遍三元素,將掃 描到的列號為1的非0元行列 交換存放於轉置后的新陣, 生成新陣第一行的非0元;
  2. 再掃描一遍三元素,將掃描 到的列號為2的非0元行列交 換存放於轉置后的新陣,生 成新陣第二行的非0元;
  3. ……   

方法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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM