三元組順序表儲存稀疏矩陣並實現兩種轉置演算法

2021-08-21 08:25:17 字數 1597 閱讀 6064

當矩陣中只有極少的非零元素,而且分布也不規律,如果非零元素個數只佔矩陣元素總數的25%~30%或低於這個百分數時,這樣的矩陣稱為稀疏矩陣。

對於稀疏矩陣中的非零元素來說,行號,列號以及元素值三項值可以唯一地確定該元素。元組順序表中的三元恰好反映了這三項值,即(row,col,value),row代表行號,col代表列號,value代表元素值。然而,這樣仍不能唯一地確定乙個稀疏矩陣。對於三元組表來說,還必須給出矩陣的總行數,總列數以及非零元素的個數,這樣才能唯一地確定乙個稀疏矩陣。

typedef struct 

triple;

typedef struct

tsmatrix;

演算法思想

① 掃瞄原三元組,並按照先列序後行序的原則進行。即第一遍從原三元組的第一行開始向下搜尋列號為1的元素,只要找到則順序存入轉置後的三元組表;

② 第2遍仍然從原三元組的第一列開始向下搜尋列號為2的元素,只要找到則順序存入轉置後的三元組表;

......

③ 第n遍(n代表原三元組總共有多少列)將列號為n的元素,依次填入轉置後的三元組表。

主要介紹原始演算法和改進後的演算法

// 轉置運算(掃瞄三元組,按照先列序後行序的原則進行)

void transposetsmatrix1 (tsmatrix *a, tsmatrix *b)

}} }

}// 改進後的按列序遞增進行矩陣轉置

// 就是利用非零元素的個數加以控制,讓外重迴圈提前結束

void transposetsmatrix2 (tsmatrix *a, tsmatrix *b)

if (k > a->nums)

break;

}} }

}

演算法思想

該演算法是對被轉置矩陣的三元組表只掃瞄一次,使得所有的非零元素一次性存放到轉置後的三元組表中。

主要就在於num[col](存放第col列元素個數)和position[col]**置後第col行的開始位置)

① 掃瞄原矩陣a的三元組表,統計出其中每一列的非零元素的個數,存放到陣列num[col]中(num[col]存放原矩陣a中第col列的非零元素個數)

② 計算轉置矩陣的每一行在其三元組表中的開始位置,並存放到position[col]中(position[col]存放轉置矩陣中第col行的開始位置)

③ 再次掃瞄原矩陣a的三元組表,根據非零元素的列號col,確定它轉置後的行號,查position表,按查到的位置直接將該項存入轉置三元組中,並修改position[col],將其指向該行下乙個元素的儲存位置(position[col]++)。

void fast_transposetsmatrix (tsmatrix *a, tsmatrix *b)	}	

}

按列序遞增進行轉置就是通過原三元組a中的col數,依次按照1-col的順序存入到新三元組b中。而一次定位快速轉置演算法則是事先通過三元組a的列(對應於三元組b的行)找到每個col號中元素的數目和每個col號的起始位置,從而在三元組b中直接定位位置存入。

稀疏矩陣(三元組順序表實現)

定義了乙個稀疏矩陣類,有轉置和相乘,相加三個功能,主要是熟悉稀疏矩陣的三元組順序表儲存的一些操作,和一般的矩陣不同的地方,兩個轉置的演算法,第乙個是較容易想到的,書上管它叫 按需點菜 法,就是按一開始列的順序,乙個個轉為新矩陣中行的順序。第二個叫作 按位就坐 法,就是條件兩個輔助陣列,確定每一列中第...

稀疏矩陣的三元組順序儲存

該資料結構的操作主要是陣列的相加 和相乘,這兩個演算法全是我個人所寫,絕無參考,經測試應該少有bug a.h include define false 0 define true 1 define ok 1 define error 0 define max size 100 typedef int...

三元組表示稀疏矩陣並相加

要求稀疏矩陣用三元組結構儲存,實現矩陣a b c,並採用矩陣形式顯示結果。定義兩個結構體,triple結構體用來存放每乙個非零元素的資訊 行標,列標,數值 tripledata用來存放兩個三元組矩陣的資訊 行數,列數,非零元素的個數 每乙個三元組結構都需要呼叫這兩個結構體,兩個結構體共同組成乙個稀疏...