三元組順序表表示的稀疏矩陣的初始化和快速轉置
阿新 • • 發佈:2018-11-28
//三元組順序表表示的稀疏矩陣的初始化
#include <stdio.h> #include<stdlib.h> #include"constant.h" #define MAXSIZE 12500//假設非零元最大個數為12500 typedef int ElemType; typedef struct{ int i,j;//非零元行下標和列下標 ElemType e;//資料域 }Triple; typedef struct{ Triple data[MAXSIZE+1];//data[0]未使用 int mu,nu,tu;//三元組矩陣的行數,列數和非零元個數 }TSMatrix;//三元組的儲存表示 //三元組初始化 Status Init_tsmatrix(TSMatrix *M) { int m,n,t; printf("Inpnt the row of the TSMatrix:"); scanf("%d",&m); printf("Input the clown of the TSMatrix:"); scanf("%d",&n); printf("Input the number of the TSMatrix:"); scanf("%d",&t); printf("Input the data in row order\n "); if(m>0&&n>0){ if(t<=MAXSIZE) { for(int k=1;k<=t;k++) { scanf("%d%d%d",&M->data[k].i,&M->data[k].j,&M->data[k].e); if(M->data[k].i>m||M->data[k].j>n) return ERROR; } }else return ERROR; }else{ M->mu=0;M->nu=0;M->tu=0; } M->mu=m;M->nu=n;M->tu=t; return OK; }
//三元組矩陣的快速轉置
其中,為防止在M中多次遍歷以尋找T中每一行的元素,用num陣列記錄M每一列非零元出現的次數,並由此算出每一列的第一個非零元在T中的下標位置,用cpot陣列記錄
Status FastTransposeSMatrix(TSMatrix M,TSMatrix *T)//M轉置後放在T中 { T->mu=M.nu;//行列互換 T->nu=M.mu; T->tu=0; int num[M.nu+1],cpot[M.nu+1];num[0],cpot[0]均不使用 int col,t,p,q; if(M.tu)//三元組不為空 { for(col=1;col<=M.nu;col++) num[col]=0; for(t=1;t<=M.tu;t++) ++num[M.data[t].j];//記錄M中每一列的元素個數 cpot[1]=1;//第一行元素起始下標為1 for(col=2;col<=M.nu;col++) cpot[col]=cpot[col-1]+num[col-1];//cpot陣列記錄T中每一行起始元素下標 for(p=1;p<=M.tu;p++)//逐個移入T陣中 //遍歷一遍M矩陣即可得到T矩陣 { col=M.data[p].j; q=cpot[col]; T->data[q].j=M.data[p].i; T->data[q].i=M.data[p].j; T->data[q].e=M.data[p].e; cpot[col]++;//此時要把該行起始元素對應的下標後移一位 } T->tu=M.tu;//非零元個數不變 } return OK; }
該演算法時間複雜度為O(mu*nu),比轉置的一般演算法(每求一列迴圈一次)的複雜度O(n*tu)小,大大節省了執行效率。