稀疏矩陣的乘法操作

2021-07-26 23:06:02 字數 3610 閱讀 3324

此操作的演算法我就不多說了,**裡面敘述得很清楚了。下面就是此程式:

[cpp]view plain

copy

# include 

# include 

# define null 0

# define ok 1

# define error 0

# define maxsize 100 /*  矩陣中非零元的最大值 */

# define maxrc 10             /*  矩陣的最大行值  */

typedef

int status ;  

/********** 稀疏矩陣的行邏輯鏈結的順序表儲存表示 **********/

typedef

struct

/*  非零元的三元組    */

triple;       

typedef

struct

/*    稀疏矩陣的行邏輯鏈結的順序表         */

rlsmatrix;   /*    r:row     l:logic    s:sequence      */

/********* 基本操作的函式原型的宣告 *********/

status createsmatrix_rl(rlsmatrix    * matrix);  

//     建立乙個稀疏矩陣;

//     輸入行數、列數,支援亂序輸入三元組,並計數;

//     以行為主序進行重新排列,並記錄每行起始位置於matrix->rpos[row];

//     若非零元超過 maxsize或行數超過maxrc,則返回error,否則ok;

void printsmatrix_rl(rlsmatrix       * matrix);  

//     輸入矩陣,列印出矩陣的行數、列數、非零元個數,以及整個矩陣;

status multsmatrix_rl(rlsmatrix      * m,rlsmatrix  * n,rlsmatrix * q);  

//     輸入兩個稀疏矩陣m和n,並初始化q,然後計算m*n的值賦給q;

//     如果m->mu!=n->nu或列數大於maxrc或者計算出的非零元個數大於maxsize,都返回error,否則ok;

//     計算過程如下:

//     1.    由於矩陣m和q的行數相等並且c語言以行為主序進行儲存,所以以m進行逐行的掃瞄。

//     2.    使q的此行邏輯表的序號等於其非零元個數q.tu+1,以表示其行的首個元素的序號。

//     3.    從行中找到m的非零元,並以它的列值為n的行號,對n進行行的掃瞄,若存在,則依次計算它們,並把其值累加到乙個以n中這個對應非零元的列值為序號的臨時陣列ctemp[ccol]中。

//     4.    在m的當前行完成掃瞄後,將ctemp[ccol]不為0的值,壓入到q矩陣的三元組,累加++q.tu,若q.tu大於了maxsize,這返回error。 

/************ main( ) 函式對矩陣乘法的實現  ************/

void main()  

else

printf("m.mu and n.nu are not mathing/n");  

}  else

printf("input error./n");  

}  /*********** 基本操作的演算法描述 ****************/

status createsmatrix_rl(rlsmatrix    * matrix)  

//     建立乙個稀疏矩陣;

//     輸入行數、列數,支援亂序輸入三元組,並計數;

matrix->tu=num;                  //     num的值即為此矩陣的非零元個數;

for(p=1;p<=matrix->tu-1;++p)            

//     按行為主序依次重新排列非零元

temp=matrix->data[min].i;                         //     交換行值;          

matrix->data[min].i=matrix->data[p].i;  

matrix->data[p].i=temp;  

temp=matrix->data[min].j;                         //     交換列值;

matrix->data[min].j=matrix->data[p].j;  

matrix->data[p].j=temp;  

temp=matrix->data[min].e;                        //     交換元素值;

matrix->data[min].e=matrix->data[p].e;  

matrix->data[p].e=temp;  

}  for(row=1,num=0;row<=matrix->mu;++row)            

//     記錄matrix->rpos[row];

return ok;  

}  //     時間複雜度分析:

//     1.    輸入非零元:o(tu);     2.    重新排列(最壞情況下);o(tu*(tu-1)) ;    3.    記錄行邏輯表:o(mu)

void printsmatrix_rl(rlsmatrix       * matrix)  

//     輸入矩陣,列印出矩陣的行數、列數、非零元個數,以及整個矩陣;

else

printf("%4d",null);           

/*    沒有非零元的地方補0 */

}  printf("/n");           

/*    每行輸入完畢後,換行         */

}  }  

//     時間複雜度:o(mu*nu).

status multsmatrix_rl(rlsmatrix      * m,rlsmatrix  * n,rlsmatrix * q)  

//     輸入兩個稀疏矩陣m和n,並初始化q,然後計算m*n的值賦給q 

}  for(ccol=1;ccol<=q->nu;++ccol)  

/*    將此行非零元壓縮入q中   */

}  }  }  

return ok;  

}  //     時間複雜度:o(m->mu*(n->nu+m->nu*n->nu+n->nu));            

status createsmatrix_rl(rlsmatrix    * matrix)

這個函式我用 2 種演算法進行了編寫:第一種不支援亂序輸入,而且輸入很麻煩。第二種則使得輸入很方便、清楚。

所以,我想總結一下函式在宣告時,對函式進行說明的流程:

1.   確定功能,詳細描述這個功能,即要達到哪些效果。好的功能能夠使程式更加人性化。

2.   設計演算法。

3.   盡量給出此函式的完整定義。

我覺得確定功能應該是首要工作,因為它是整個思路的方向,所以我放在了第一位,必須認真地對待。

稀疏矩陣的乘法

1492.稀疏矩陣的乘法 時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述計算兩個稀疏矩陣的乘法 輸入首先輸入第乙個矩陣的行數和列數,再輸入該矩陣的三元組形式,以0 0 0結束 然後輸入第二個矩陣的行數和列數,再輸入該矩陣的三元組形式,以0 0 0結束 輸出兩個矩陣相乘後得到...

7 稀疏矩陣的乘法運算

資料壓縮是提高傳輸 儲存效率一種技術。教材第5章介紹了兩種簡單的壓縮儲存方法。本實驗要求實現兩個稀疏矩陣相乘積的演算法。其中稀疏矩陣非零元素數量小於100.輸入 第1個 稀疏矩陣的行數 列數 非零元個數 三個數都大於0 三元組 第2個 稀疏矩陣的行數 列數 非零元個數 三個數都大於0 三元組 以行為...

LeetCode 311 稀疏矩陣的乘法

本題是 leetcode 會員才能看 給你兩個 稀疏矩陣 a 和 b,請你返回 ab 的結果。你可以預設 a 的列數等於 b 的行數。請仔細閱讀下面的示例。示例 輸入 a 1,0,0 1,0 3 b 7 0,0 0 0,0 0 0,1 輸出 10 0 7 00 700 ab 103 x 00 0 7...