設矩陣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