C++ 用三元組表示法存儲稀疏矩陣


若有一個矩陣(m*n),其中非0元素個數遠少於數值為0的元素個數,若開辟一個m*n大空間,來存儲這樣一個很多元素值為0的矩陣,浪費空間,於是我們只存儲這些非0的元素的下標及數值

用一個結構體——三元組,來表示這些非零元素的行r,列c,數值v的信息

typedef struct //三元組 
{
    int r;  //非零元所在的行 
    int c;  //非零元所在的列
    int v;  //非零元的值 
} node;

一個完整矩陣的包括這些信息需要存儲:矩陣的總行m,總列n,非零元的個數N,以及這些非零元的信息,所以再將這些信息用一個結構體來表示出來,其中非零元的相關信息用一個一維數組node a[100]來存儲

為什么用一維數組就可以來存儲矩陣(二維數組)的信息呢

這就是結構體node的方便之處 —— node將行、列、數值打包成一個整體

typedef struct
{
    int m;  //稀疏矩陣的行數
    int n;  //稀疏矩陣的列數
    int N;  //稀疏矩陣中非零元的個數 
    node a[100]; //存儲非零元的數組a
}Matrix;

定義 Matrix M;

查找稀疏矩陣中是否存在值為p的元素

存在,則輸出所在的行M.a[i].r,列M.a[i].c,

不存在,輸出ERROR

 

首先用for循環實現,終止條件為i==M.N

如果匹配不成功,輸出ERROR。如何表示匹配不成功呢,這里用一個flag來標記,0表示不成功,flag初值為0,

如果匹配成功,后續就不用再繼續匹配,flag==1;輸出該元素所在的行M.a[i].r,列M.a[i].c     同時用break結束循環

在for循環外判斷flag的值  if(flag==0),則表示從i=0到i=M.N-1,都未匹配成功 那么cout<<"ERROR";

void search(Matrix M,int p)  //查找p是否在稀疏矩陣中 
{
    int i=0;
    int flag=0; 
    for(i=0;i<M.N;i++)       //匹配數組a中元素的value和p 
    {
        if(p==M.a[i].v)      //相等 
        {
            flag=1;    
            cout<<M.a[i].r<<" "<<M.a[i].c<<endl; //輸出所在的行列
            break;   //跳出for循環 
        }
    }
    if(flag==0)  //若未匹配成功,輸出ERROR 
        cout<<"ERROR"<<endl;  
}

 


免責聲明!

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



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