稀疏矩陣是指矩陣中大多數元素為0的矩陣。從直觀上講,當非零元素個數低於總元素30%時,這樣的矩陣稱為稀疏矩陣。
稀疏矩陣的三元組表表示法
對於稀疏矩陣的亞索儲存,採取值儲存非零元素的方法,由於非零元素的分布沒有規律,因此必須同時儲存非零元素的下標,即所處的行號和列號,這就是稀疏矩陣的三元表示法。(以下標從1開始計數)
可以表示為
說明:為方便處理將稀疏矩陣的非零元素對應的三元組按照行序為主列的一維陣列結構進行存放,講句真的每一行從小到大的全部的非零元素按照三元組方式進行按列號遞增存放,得到上述矩陣。
#define maxsize 100
typedef
struct
node;
typedef
struct
tsmatrix;
void transmatrix(elementtype source[m][n],elementtype dst[n][m])
}}
用三元組表實現稀疏矩陣的轉置
假設a和b是稀疏矩陣source和dst的三元組表,實現轉置的簡單方法如下。
1:矩陣source的三元組表a的行,列互換就可以得到b中的元素。
2:轉置之後的三元表組並未按照行序為主序儲存的,為保證轉置後的矩陣三元表組b同樣按照行序為主序進行存放,
則需要對行,列互換後的三元表組b按b的行下標(即a的列下標)以遞增順序重新排序
按照上述方法雖然第一步容易實現但是步驟二重新排序勢必會移動大量的元素,從而影響演算法的效率。
為了避免上述問題,可以有以下兩種方法。
方法一:列序遞增轉置法
演算法思想:按照被轉置矩陣的三元表組a的列序(即轉置後三元組表b的行序)遞增的順序進行轉置,並依次送入轉置
後的矩陣的三元組表b中,這樣一來,轉置後矩陣的三元組表b恰好是按照行序為主序的
具體流程:
第一遍從頭到尾掃瞄三元組表a,找出其中所有列(col)為1的三元組,轉置之後送入三元組表b中
然後找出所有列(col)為2的三元組,轉置之後送入三元組表b中
以此類推找出所有列(col)為k的三元組,轉置之後送入三元組表b中(下標從0開始)
演算法描述:
void transposetsmatrix(tsmatrix a,tsmatrix* b)}}
}}演算法分析:
演算法的耗時主要集中在雙重迴圈中,其時間複雜度為o(a.n*a.length)。
方法二:一次定位快速轉置法
演算法思想:方法一中需要通過啊雙重迴圈來實現行序遞增形式的轉置為了將被轉置矩陣a一次性的定位到b的正確位
置上,需要計算下面資料
1:待轉置矩陣每一列非零元素個數,即轉置之後b中每一行非零元素個數。
2:待轉置矩陣每一列第乙個非零元素在三原表b中的正確位置,即轉置之後b中每一行第乙個非零元素的個數
為此需要設定兩個陣列,分別為num,position,其中num存放待轉置矩陣每一列非零元素個數
,position存放待轉置矩陣每一列第乙個非零元素在三元組表b中的正確位置
num的計算方法為,將三原表組掃瞄一遍,對應其中的列號,給相應的num下標加1
position的計算方法如下:
position[0]=0,表示三元組表a中,列值為0的第乙個非零元素在三元組表b中的下標值為0
position[col] = position[col-1]+number[col-1]
上表的對應的num,position值如下表:
一次快速定位轉置的具體做法是,position[col]的初值是三元組表a中每一列第乙個非零元素在b中的正確位置,當三元組
表a中第col列有乙個元素加入到b時,position[col]=position[col]+1,即令position[col]始終指向三元組
表a中第col中下乙個非零元素在三元組表b中的正確存放位置
演算法描述:
fasttransposetsmatrix(tsmatrix a,tsmatrix *b)}}
稀疏矩陣的鏈式儲存結構:十字鍊錶表示法
在十字鍊錶中,矩陣的每乙個非零元素用乙個節點表示,該節點除了(row,col,element)以外,還要新增以下兩個鏈域:right用於鏈結同一行中的下乙個非零元素,down用於鏈結同一列中的下乙個非零元素。
在十字鍊錶中,同一行的非零元素通過right域連線成乙個單鏈表,同乙個列的非零元素通過down域連線成乙個單鏈表。這樣任意乙個非零元素所對應的節點同時處於乙個行和列的節點。同時再附帶乙個存放所有行煉表和列聯表的頭指標的一維陣列。
十字鍊錶的型別定義如下
typedef
struct olnode
olnode; *olink;
typedef
struct
資料結構 陣列 矩陣 和廣義表
陣列的儲存結構 一維陣列 多維陣列都是存放在乙個按行優先 也可以按列優先 的一維長陣列中。對稱矩陣中的元素是按主對角線對稱的,即上三角部分和下三角部分元素是對應相等的。在儲存時,一般儲存主對角線元素以及下三角部分元素,按行優先。n階對稱矩陣a可以儲存在一維陣列b 0.n n 1 2 1 一共需儲存n...
陣列和廣義表
一 陣列 陣列是一組型別相同的資料元素構成。有一維陣列 二維陣列 n 維陣列。一般實現時,可以過載操作符,比較方便一點。二 矩陣 1 矩陣的加減,需要兩個矩陣擁有相同的行列數才可以。對應各個位置分別進行計算 2 矩陣的相乘,需要第乙個陣的列數等於第二個的行數。如c 0,0 a 的第一列分別乘以 b的...
陣列和廣義表
陣列一旦被定義,它的維數和維界就不再改變 採用順序結構儲存結構表示陣列 二維陣列的儲存方式 以行序為主 c語言 以列序為主 loc i,j loc 0,0 b2 i j l 陣列是隨機儲存結構,由於計算各個元素儲存位置的時間相等,所以儲存陣列中任一元素的時間也相等。壓縮儲存 為多個值相同的元只分配乙...