當前位置:成語大全網 - 書法字典 - 矩陣稀疏矩陣的多維數組壓縮存儲(I)

矩陣稀疏矩陣的多維數組壓縮存儲(I)

稀疏矩陣

設矩陣A mn中有s個非零元素,如果s遠小於矩陣元素的總數(即s

1稀疏矩陣的壓縮存儲

為了節省存儲單元,只能存儲非零元素。因為非零元素的分布壹般是不規則的,所以必須同時存儲非零元素。

元素的行號和列號可以快速確定非零元素在矩陣中的位置。稀疏矩陣的壓縮存儲將失去隨機存取功能。

每個非零元素的行號、列號和值構成壹個三元組(I,J,a ij),由這個三元組唯壹確定。

稀疏矩陣的壓縮存儲通常有兩種方法:順序存儲和鏈式存儲。有關鏈式存儲方法,請參見參考書目。

2、三聯表

以行優先(或列優先)的順序排列表示稀疏矩陣非零元素的三元組(跳過零元素),並按照稀疏矩陣的順序將它們依次存儲在向量中

存儲結構被稱為三元組表。

註意:

在下面的討論中,假設三元組按照行優先級的順序排列。

例如,請參見圖(b),了解下圖(A)所示稀疏矩陣A的三元組表表示。

(1)三元表的類型描述

為了操作方便,矩陣的行、列和非零元素的總數被描述為三元組表的屬性。。溫維特。其類型描述為:

#define MaxSize 10000 //由用戶定義。

typedef int數據類型;//由用戶定義

Typedef結構{//三重

int i,j;//非零元素的行號和列號

數據類型v;//非零元素的值

} TriTupleNode

Typedef結構{ //三元表

TriTupleNode數據【MaxSize】;//三元表空間

int m,n,t;//矩陣的行數、列數和非零元素數

} TriTupleTable

(2)壓縮存儲結構上矩陣的轉置操作

m×n矩陣A,其轉置矩陣B是n×m矩陣;

a【I】【j】= B【j】【I】,0≤I & lt;m,0≤j & lt;n,p =““& gt;& lt/m,0≤j & lt;n,& gt

也就是說,A的行是B的列,A的列是B的行..

例如,下圖中的B和上圖中的A都是轉置矩陣。

①用三聯表表示矩陣轉置的思想方法

步驟1:根據矩陣A的行數、列數和非零元素數確定矩陣B的列數、行數和非零元素數..

第二步:當三元組表不為空(A矩陣的非零元素不為0)時,根據A矩陣三元組表(以下簡稱三元組表)的節點空間數據,計算A的三元組。

元組表a-》;數據被b-》替換的三元組表;數據。

②三聯表換位

方法1:簡單地交換a-》;數據中I和J的內容按列優先級順序存儲,倒B-》;數據;然後b-》;數據按照行優先級順序重新排列到壹個三元組表中。

方法二:由於A的列是B的行,所以按A-》;對數據的列順序進行轉置,得到轉置矩陣B的三元組表B。數據必須首先按行存儲。

這樣設計的算法的基本思想是:對於col(0≤col≤a-》的每壹列;N-1),通過掃描三元組表A-》;數據,找出所有

那些列號等於col的三元組,交換它們的行號和列號,然後依次釋放它們B-》;數據,您可以獲得b的行優先壓縮存儲表示形式。

動畫演示

③具體算法:

空傳輸矩陣(三重表*b,三重表*a)

{//*a、*b是矩陣A和B的三元組表表示,求A轉置到B。

int p,q,col

B- & gt;m = a-& gt;n;B- & gt;n = a-& gt;m;//A和B的總行數和列數互換。

B- & gt;t = a-& gt;t;//非零元素的總數

if(b-》;t & lt=0)

錯誤(“A = 0“);//如果A中沒有零元,則退出。

q = 0;

for(col = 0;colncol++)//對於。

for(p = 0;pt;p++)//掃描a的三元組表。

if(a-》gt;數據【p】。j = = col){//查找列號為col的三元組。

B- & gt;數據【q】。I = a-& gt;數據【p】。j;

B- & gt;數據【q】。j = a-& gt;數據【p】。我;

B- & gt;數據【q】。v = a-& gt;數據【p】。五;

q++;

}

}//轉換矩陣

④算法分析

該算法的時間主要花在col和p的雙環上;

如果A的列數為n,非零元素數為t,則執行時間為O(n×t),與A的列數和非零元素數的乘積成正比。

通常,當矩陣用二維數組表示時,其轉置算法的執行時間為O(m×n),與行數和列數的乘積成正比。

由於非零元素的數量壹般遠大於行數,因此上述稀疏矩陣轉置算法的時間比通常的轉置算法要長。

Lishi Xinzhi/Article/program/sjjg/201311/23897