解決稀疏矩陣問題

2021-06-06 17:17:25 字數 2073 閱讀 7549

一、稀疏矩陣的定義

對於那些零元素數目遠遠多於非零元素數目,並且非零元素的分布沒有規律的矩陣稱為稀疏矩陣(sparse)。

人們無法給出稀疏矩陣的確切定義,一般都只是憑個人的直覺來理解這個概念,即矩陣中非零元素的個數遠遠小於矩陣元素的總數,並且非零元素沒有分布規律。

二、稀疏矩陣的壓縮儲存

由於稀疏矩陣中非零元素較少,零元素較多,因此可以採用只儲存非零元素的方法來進行壓縮儲存。

由於非零元素分布沒有任何規律,所以在進行壓縮儲存的時侯需要儲存非零元素值的同時還要儲存非零元素在矩陣中的位置,即非零元素所在的行號和列號,也就是在儲存某個元素比如aij的值的同時,還需要儲存該元素所在的行號i和它的列號j,這樣就構成了乙個三元組(i,j,aij)的線性表。

三元組可以採用順序表示方法,也可以採用鏈式表示方法,這樣就產生了對稀疏矩陣的不同壓縮儲存方式。

a、稀疏矩陣的順序實現

若把稀疏矩陣的三元組線性表按順序儲存結構儲存,則稱為稀疏矩陣的三元組順序表。 

順序表中除了儲存三元組外,還應該儲存矩陣行數、列數和總的非零元素數目,這樣才能唯一的確定乙個矩陣。

順序儲存結構儲存三元組線性表的c#**如下:

** struct tupletype

}class spmatrix

b、稀疏矩陣的十字鍊錶實現

十字鍊錶結點分為三類 : 

表結點,它由五個域組成,其中i和j儲存的是結點所在的行和列,right和down儲存的是指向十字鍊錶中該結點所有行和列的下乙個結點的指標,v用於存放元素值。

行頭和列頭結點,這類結點也有域組成,其中行和列的值均為零,沒有實際意義,right和down的域用於在行方向和列方向上指向表結點,next用於指向下乙個行或列的表頭結點。

總表頭結點,這類結點與表頭結點的結構和形式一樣,只是它的i和j存放的是矩陣的行和列數。

十字鍊錶可以看作是由各個行煉表和列鍊錶共同搭建起來的乙個綜合鍊錶,每個結點aij既是處在第i行鍊錶的乙個結點,同時也是處在第j列煉表上的乙個結點,就你是處在十字交叉路口上的乙個結點一樣,這就是十字鍊錶的由來。

十字鍊錶中的每一行和每一列鍊錶都是乙個迴圈鍊錶,都有乙個表頭結點。

三、稀疏矩陣的實現

矩陣運算通常包括矩陣轉置、矩陣加、矩陣乘、矩陣求逆等。這裡僅討論最簡單的矩陣轉置運算演算法。

矩陣轉置運算是矩陣運算中最重要的一項,它是將m×n的矩陣變成另外乙個n×m的矩陣,使原來矩陣中元素的行和列的位置互換而值保持不變,即若矩陣n是矩陣m的轉置矩陣,則有:m[i][j]=n[j][i] (0≤i≤m-1,0≤j≤n-1)。

三元組表表示轉置矩陣的具體方法是:

第一步:根據m矩陣的行數、列數和非零元總數確定n矩陣的列數、行數和非零元總數。

第二步:當三元組表非空(m矩陣的非零元不為0)時,對m中的每一列col(0≤col≤n-1),通過從頭至尾掃瞄三元組表data,找出所有列號等於col的那些三元組,將它們的行號和列號互換後依次放人n的data中,即可得到n的按行優先的壓縮存貯表示。

** class spmatrix

set}

public int nd

set}

public int td

set}

//三元組表的data屬性

public tupletype data

set}

//初始化三元組順序表

public spmatrix()

public spmatrix(int maxnum, int md, int nd)

//設定三元組表元素的值

public void setdata(int i, int j, t v)

//矩陣轉置演算法

public spmatrixtranspose()}}

}return n;

}

特殊矩陣 稀疏矩陣

對於乙個m n的矩陣,設s為矩陣的元素總個數s m n,設t為矩陣中非零元素的個數,滿足t 稀疏矩陣的零元素非常多,且分布無規律,所以稀疏矩陣的壓縮儲存方法為 只儲存矩陣中的非零元素,按照三元組的形式儲存。三元組由非零元素,該元素行下標和該元素列下標三個資料構成,放在乙個列數為3的陣列中。儲存結構又...

稀疏陣列,稀疏矩陣概念

稀疏矩陣 矩陣中非零元素的個數遠遠小於矩陣元素的總數,並且非零元素的分布沒有規律,通常認為矩陣中非零元素的總數比上矩陣所有元素總數的值小於等於0.05時,則稱該矩陣為稀疏矩陣 sparse matrix 該比值稱為這個矩陣的稠密度。稀疏陣列 稀疏陣列可以看做是普通陣列的壓縮,但是這裡說的普通陣列是值...

稀疏矩陣運算

行邏輯鏈結的三元組順序表實現,加減乘和轉置運算,調的好累,這兩天少了點勁頭了,堅持住,試了好幾組資料應該沒問題了,但也可能還有漏洞 include include include using namespace std define ok 1 define error 0 define overfl...