資料結構 稀疏矩陣的實現方法

2021-10-22 01:55:14 字數 3656 閱讀 9621

什麼是稀疏矩陣,怎麼定義才是稀疏矩陣?假設在m x n的矩陣中,有t個不為0的元素。令z=t/(m x n),若z<=0.05則稱此矩陣為稀疏矩陣。由於稀疏矩陣的非0元素較少,所以如果用大容量儲存必定會造成記憶體浪費,因此只需儲存非0元素值即可,以下列出了常用的三種儲存稀疏矩陣的方法。

三元組順序表的實現用順序儲存結構來實現。定義乙個陣列的結構體,儲存的是三元組(即由 3 部分資料組成的集合),組中資料分別表示(行標,列標,元素值)。結構體的實現如下:

//三元組結構體

typedef

struct

triple;

//矩陣的結構表示

如上圖所示即為依次再陣列中插入的 三元表。具體實現過程如下所示:

#include

#define maxsize 100

#define ok 1

#define error 0

#define elemtype int

typedef

struct

triple;

typedef

struct

tsmatrix;

void

display

(tsmatrix *s)

;int

main

(void

)void

display

(tsmatrix *s)}if

(value==0)

//若不為三元表中儲存的值就列印0

結果如上圖所示,檢查矩陣可知列印的位置是沒有問題的。

如上所示的方法能夠實現稀疏矩陣的儲存,但是在資料提取方面效率比較低,現在只是3x3的矩陣可能看不出來,但若是m和n都以千萬計的情況下稀疏矩陣中的非0元素個數近似於n,那麼時間複雜度就會達到o(m x n xn),這將非常浪費時間。因此在此方法上改進有了下面的方法。

行邏輯鏈結順序表示基於上種方法的改進,在上面的基礎上再增加乙個陣列用來儲存用來用於儲存三元表的陣列中每一行第乙個非0元素的位置,這樣就無需遍歷整個三元表陣列,只需要遍歷對應行的資料就可以了,大大提高了效率。

使用陣列 rpos 記錄矩陣中每行第乙個非 0 元素在一維陣列中的儲存位置。遍歷的具體過程如下所示:

由 rpos 陣列可知,第一行首個非 0 元素位於data[1],因此在遍歷此行時,可以直接從第 data[1] 的位置開始,一直遍歷到下一行首個非 0 元素所在的位置(data[3]之前;

同樣遍歷第二行時,由 rpos 陣列可知,此行首個非 0 元素位於 data[3],因此可以直接從第 data[3] 開始,一直遍歷到下一行首個非 0 元素所在的位置(data[4])之前;

遍歷第三行時,由 rpos 陣列可知,此行首個非 0 元素位於 data[4],由於這是矩陣的最後一行,因此一直遍歷到 rpos 陣列結束即可(也就是 data[tu],tu 指的是矩陣非 0 元素的總個數)。

#include

#define maxsize 100

#define maxsd 100

#define elemtype int

typedef

struct

triple;

typedef

struct

rlsmatrix;

void

display

(rlsmatrix *s)

;int

main

(void

)void

display

(rlsmatrix *s)

if(value ==0)

printf

("0 ");

}}else

//最後一行只需遍歷到最後乙個非0元素即可

上面兩種儲存方式用於固定儲存時可以很好的起作用,但是當要涉及非0元素的插入或者刪除的時候回引起元素值的移動,例如兩矩陣相加的操作,這種時候用鏈式儲存表示三元組更為恰當,該儲存方式採用的是 「鍊錶+陣列」 結構。

由上圖可以看到,非0元素用乙個含有五個域的節點表示,兩個指標與分別用來指向同一列和同一行的元素。再用兩個儲存行煉表和列鍊錶的一維陣列儲存這些鍊錶。每乙個非0元既是某行鍊錶的乙個節點,又是列鍊錶的乙個節點。整個矩陣構成了乙個十字交叉的鍊錶。

#include

#include

typedef

struct olnode

olnode,

*olink;

typedef

struct

crosslist;

crosslist creatematrix_ol

(crosslist m)

;void

display

(crosslist m)

;int

main()

crosslist creatematrix_ol

(crosslist m)

for(i =

1; i <= m; i++

)for

(j =

1; j <= n; j++

)for

(scanf

("%d%d%d"

,&i,

&j,&e);0

!= i;

scanf

("%d%d%d"

,&i,

&j,&e)

) p->i = i;

p->j = j;

p->e = e;

//鏈結到行的指定位置if(

null

== m.rhead[i]

|| m.rhead[i]

->j > j)

else

//鏈結到列的指定位置if(

null

== m.chead[j]

|| m.chead[j]

->i > i)

else

}return m;

}void

display

(crosslist m)}}

}

資料結構 稀疏矩陣

稀疏矩陣 矩陣中有效資料的個數遠遠小於無效資料的個數,則可以稱之為稀疏矩陣 如果還像以前那樣將每個稀疏矩陣的資料都儲存起來,則會造成記憶體的很大程度的浪費,所以應用特別的儲存方式。稀疏矩陣的壓縮儲存 使用 三元組儲存每乙個有效資料,三元組按原矩陣中的位置,以行優先順序先後順序依次存放。矩陣的轉置 將...

資料結構 稀疏矩陣

簡單的說,設矩陣amn中有s個非零元素,若s遠遠小於矩陣元素的總數,則稱a為稀疏矩陣。s與m x n的比稱為矩陣的稀疏因子。當用陣列儲存稀疏矩陣中的元素時,僅有少部分的空間被利用,造成空間的浪費,為了節省儲存空間,可以採用一種壓縮的儲存方法來表示稀疏矩陣。由於非零元素的分布一般是沒有規律的,因此在儲...

資料結構 稀疏矩陣

稀疏矩陣時矩陣中的一種特殊情況,其非零元素的個數遠遠小於零元素個數。1.順序儲存 非零元素三元組的結構定義 struct triple 其中row代表行號,col代表列號,val用來儲存元素值 稀疏矩陣的順序儲存型別定義 struct smatrix m,n,t域分別用來儲存稀疏矩陣的行數,列數,非...