/*稀疏矩陣的壓縮儲存及轉置*/
#include
using namespace std;
/*三元組順序表的型別定義*/
#define itemsize 100
typedef struct
int row,col;
int item;
}thnode;
typedef struct
thnode * data;//data[0]不用
int m,n,t;//分別表示行數、列數和非零元素個數
}thmatrix;
/*初始化三元組表*/
void initmatrix_th(thmatrix &m)
m.data=new thnode[itemsize+1];
m.m=0;
m.n=0;
m.t=0;
/*轉置三元組表*/
//一般方法,演算法時間複雜度較高
void transmatrix_1(thmatrix m,thmatrix &t)
initmatrix_th(t);
t.m=m.n;
t.n=m.m;
t.t=m.t;
if(t.t)
int p=1;//用來指m中的元素
int q=1;//用來指t中的元素
int col;//用來遍歷列中的元素
for(col=1;col<=m.n;col++)
for(p;p<=m.t;p++)
if(m.data[p].col==col)
t.data[q].row=m.data[p].col;
t.data[q].col=m.data[p].row;
t.data[q].item=m.data[p].item;
q++;
//改進的方法——快速轉置
void transmatrix_2(thmatrix m,thmatrix &t)
initmatrix_th(t);
t.m=m.n;
t.n=m.m;
t.t=m.t;
int i,j,p,q;
int num[100];
int cpot[100];
if(t.t)
for(i=1;i<=m.n;i++)
num[i]=0;//m中每一列的非零元素個數初始化為0
for(i=1;i<=m.t;i++)
++num[m.data[i].col];//m中每一列的非零元素個數儲存到乙個陣列中
cpot[1]=1;
for(i=2;i<=m.n;i++)
cpot[i]=cpot[i-1]+num[i-1];//每一列第乙個非零元素的位置
for(p=1;p<=m.t;p++)
j=m.data[p].col;
q=cpot[j];//確定第j列第乙個非零元素的位置
t.data[q].row=m.data[p].col;
t.data[q].col=m.data[p].row;
t.data[q].item=m.data[p].item;
++cpot[j];//指向下乙個位置
/*建立乙個三元組表*/
//按行優先儲存
void creatmatrix(thmatrix &m,int n)
initmatrix_th(m);
int i;
cin>>m.m>>m.n;
for(i=1;i<=n;i++)
cin>>m.data[i].row>>m.data[i].col>>m.data[i].item;
m.t=n;
/*輸出乙個三元組表*/
void outputmatrix(thmatrix m)
int i;
coutcoutthmatrix m;
thmatrix t;
creatmatrix(m,8);
//outputmatrix(m);
transmatrix_2(m,t);
outputmatrix(t);
稀疏矩陣的壓縮儲存與轉置
稀疏矩陣 m n的矩陣,矩陣中有效值的個數 遠小於無效值的個數,且這些資料的分布沒有規律。1 0 3 0 5 0 0 0 0 0 0 0 0 0 0 2 0 4 0 6 0 0 0 0 0 0 0 0 0 0 稀疏矩陣的壓縮儲存 壓縮儲存值儲存極少數的有效資料。使用 三元組儲存每乙個有效資料,三元組...
稀疏矩陣的壓縮儲存和轉置
稀疏矩陣的特點 零元多,非零元遠少於零元,儲存資料沒什麼規律 因此可以採用只儲存非零元素的方法來進行壓縮儲存 為了節省空間 所以在進行壓縮儲存的時侯需要儲存非零元素值的同時還要儲存非零元素在矩陣中的位置,即非零元素所在的行號和列號,也就是在儲存某個元素比如aij的值的同時,還需要儲存該元素所在的行號...
稀疏矩陣的壓縮儲存與轉置
稀疏矩陣的三元組表述法 型別結構 template struct triple template class sparsematrix 實現壓縮儲存 稀疏矩陣 template sparsematrix sparsematrix template sparsematrix sparsematrix ...