此操作的演算法我就不多說了,**裡面敘述得很清楚了。下面就是此程式:
[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...