稀疏矩陣壓縮的存儲方法
稀疏矩陣壓縮存儲
一般來講,零元素多到了一定程度並且沒有規律分布的矩陣叫做稀疏矩陣。對稀疏矩陣的壓縮存儲必須充分考慮以下三個問題:
① 盡可能減少或者不存儲零元素以節省空間,降低空間復雜度。
② 盡可能快地實現數據元素的存儲位置與原有位置之間的轉換。
③ 盡可能不與零元素進行運算,以降低時間復雜度。
稀疏矩陣的壓縮存儲有三種最常見的方法,分別是三元組順序表、行邏輯鏈接順序表和十字鏈表。
⑵ 對稀疏矩陣進行壓縮存儲目的是() A.便於進行矩陣運算 B.便於輸入和輸出 C.節省存儲空間 D.降低運
對稀疏矩陣進行壓縮存儲目的是節省存儲空間。
稀疏矩陣的存儲方式:
存儲矩陣的一般方法是採用二維數組,其優點是可以隨機地訪問每一個元素,因而能夠較容易地實現矩陣的各種運算。但對於稀疏矩陣而言,若用二維數組來表示,會重復存儲了很多個0了,浪費空間,而且要花費時間來進行零元素的無效計算。所以必須考慮對稀疏矩陣進行壓縮存儲。
(2)稀疏矩陣壓縮的存儲方法擴展閱讀:
最常用的稀疏矩陣存儲格式主要有:三元組(i,j,a(i,j))和CSR(Compressed Sparse Row)。
(1) 三元組(i,j,a(i,j))(也叫COO(Coordinate Format))
三元組(i,j,a(i,j))很簡單,就是使用3個數組,分別存儲全部非零元的行下標(row index)、列下標(column index)和值(value)
(2) CSR存儲(Compressed Sparse Row,壓縮稀疏的行)
CSR是比較標準的一種,也需要三類數據來表達:數值,列號,以及行偏移。數值和列號與COO一致,表示一個元素以及其列號,行偏移表示某一行的第一個元素在values裡面的起始偏移位置。
⑶ 數據結構 稀疏矩陣一般的壓縮存儲方法有哪幾種
來自 嚴蔚敏《型臘數據缺中結構》
稀疏伏租山矩陣的壓縮方法主要有:
1:三元組順序表 (行下標,列下標,值)
2:行邏輯鏈接的順序表。
3:十字鏈表。
⑷ 稀疏矩陣的壓縮存儲只需要存儲什麼
非零元素。
對於一個用二維數組存儲的稀疏矩陣Amn,如果假設存儲每個數組元素需要L個位元組,那麼存儲整個矩陣需要m*n*L個位元組。但是,這些存儲空間的大部分存放的是0元素,從而造成大量的空間浪費。為了節省存儲空間,可以只存儲其中的非0元素。
(4)稀疏矩陣壓縮的存儲方法擴展閱讀
稀疏矩陣演算法的最大特點是通過只存儲和處理非零元素從而大幅度降低存儲空間需求以及計算復雜度,代價則是必須使用專門的稀疏矩陣壓縮存儲數據結構。稀疏矩陣演算法是典型的不規則演算法,計算訪存比很低,並且計算過程中的訪存軌跡與稀疏矩陣的稀疏結構相關。
⑸ 稀疏矩陣一般的壓縮存儲方法有兩種
1.三元數組存儲(行,列,值)
2.行指針鏈表(第一列為數組,用指針鏈接到本行下一個有意義的位置)
3.十字鏈表(實在是太復雜了...)
⑹ 多維數組-矩陣的壓縮存儲- 稀疏矩陣(一)
稀疏矩陣
設矩陣A mn 中有s個非零元素 若s遠遠小滑賀於矩陣元素的總數(即s< <m×n),則稱a為稀疏矩陣。 p=""> </m×n),則稱a為稀疏矩陣。>
1、稀疏矩陣的壓縮存儲
為了節省存儲單元,可只存儲非零元素。由於非零元素的分布一般是沒有規律的,因此在存儲非零元素的同時,還必須存儲非零
元素所在的行號、列號,才能迅速確定一個非零元素是矩陣中的哪一個元素。稀疏矩陣的壓縮存儲會失去隨機存取功能。
其中每一個非零元素所在的行號、列號和值組成一個三元組(i,j,a ij ),並由此三元組惟一確定。
稀疏矩陣進行壓縮存儲通常有兩類方法:順序存儲和鏈式存儲。鏈式存儲方法【參見參考書目】。
2、三元組表
將表示稀疏矩陣的非零元素的三元組按行優先(或列優先)的順序排列(跳過零元素),並依次存放在向量中,這種稀疏矩陣的順序
信輪派存儲結構稱為三元組表。
注意:
以下的討論中,均假定三元組是按行優先順序排列的。
【例】下圖(a)所示的稀疏矩陣A的三元組表表示見圖(b)
(1)三元組表的類型說明
為了運算方便,將矩陣的總行數、總列數及非零元素的總數均作為三元組表的屬性進行描述。.WINGwIT.其類型描述為:
#define MaxSize 10000 //由用戶定義
typedef int DataType; //由用戶定義
typedef struct { //三元組
int i,j;//非零元的行、列號
DataType v; //非零元的值
}TriTupleNode;
typedef struct{ //三元組表
TriTupleNode data[MaxSize]; //三元組表空間
int m,n,t; //矩陣的行數、列數及非零元個數
}TriTupleTable;
(2) 壓縮桐雀存儲結構上矩陣的轉置運算
一個m×n的矩陣A,它的轉置矩陣B是一個n×m的矩陣,且:
A[i][j]=B[j][i],0≤i <m,0≤j<n, p=""> </m,0≤j<n,>
即A的行是B的列,A的列是B的行。
【例】下圖中的B和上圖中的A互為轉置矩陣。
①三元組表表示的矩陣轉置的思想方法
第一步:根據A矩陣的行數、列數和非零元總數確定B矩陣的列數、行數和非零元總數。
第二步:當三元組表非空(A矩陣的非零元不為0)時,根據A矩陣三元組表的結點空間data(以下簡稱為三元組表),將A的三
元組表a->data置換為B的三元組表b->data。
②三元組表的轉置
方法一:簡單地交換a->data中i和j中的內容,得到按列優先順序存儲倒b->data;再將b->data重排成按行優先順序的三元組表。
方法二:由於A的列是B的行,因此,按a->data的列序轉置,所得到的轉置矩陣B的三元組表b->data必定是按行優先存放的。
按這種方法設計的演算法,其基本思想是:對A中的每一列col(0≤col≤a->n-1),通過從頭至尾掃描三元組表a->data,找出所有
列號等於col的那些三元組,將它們的行號和列號互換後依次放人b->data中,即可得到B的按行優先的壓縮存貯表示。具體實現參見
【 動畫演示 】
③具體演算法:
void TransMatrix(TriTupleTable *b,TriTupleTable *a)
{//*a,*b是矩陣A、B的三元組表表示,求A轉置為B
int p,q,col;
b->m=a->n; b->n=a->m; //A和B的行列總數互換
b->t=a->t; //非零元總數
if(b->t<=0)
Error("A=0"); //A中無非零元,退出
q=0;
for(col=0;coln;col++) //對A的每一列
for(p=0;pt;p++) //掃描A的三元組表
if(a->data[p].j==col){ //找列號為col的三元組
b->data[q).i=a->data[p].j;
b->data[q].j=a->data[p].i;
b->data[q].v=a->data[p].v;
q++;
}
} //TransMatrix
④演算法分析
該演算法的時間主要耗費在col和p的二重循環上:
若A的列數為n,非零元素個數t,則執行時間為O(n×t),即與A的列數和非零元素個數的乘積成正比。
通常用二維數組表示矩陣時,其轉置演算法的執行時間是O(m×n),它正比於行數和列數的乘積。
由於非零元素個數一般遠遠大於行數,因此上述稀疏矩陣轉置演算法的時間大於通常的轉置演算法的時間。
lishixin/Article/program/sjjg/201311/23897
⑺ 稀疏矩陣的壓縮存儲思想
為了節省存儲空間並且加快處理速度,需要對這類矩陣進行壓縮存儲,壓縮存儲的原則是:不重復存儲相同元素;不存儲零值元素。稀疏矩陣,有三元組表示法、帶輔助行向量的二元組表示法(也即行邏輯鏈表的順序表),十字鏈表表示法等。演算法基本思想:num[col]:第col列的非零元素個數;cpot[col]:第col列第一個非零元在b.data中的恰當位置;在轉置過程中,指示該列下一個非零元在b.data中的位置。
⑻ 稀疏矩陣一般的壓縮存儲方法有兩種
分別是三元組和十字鏈表。
三元組是指形如((x,y),z)的集合(這就是說,三元組是這樣的偶,其第一個射影亦是一個偶),常簡記為(x,y,z)。
三元組是計算機專業的一門公共基礎課程——數據結構里的概念。主要是用來存儲稀疏矩陣的一種壓縮方式,也叫三元組表。假設以順序存儲結構來表示三元組表(triple table),則得到稀疏矩陣的一種壓縮存儲方式,即三元組順序表,簡稱三元組表。
十字鏈表(Orthogonal List)是有向圖的另一種鏈式存儲結構。該結構可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的。用十字鏈表來存儲有向圖,可以達到高效的存取效果。同時,代碼的可讀性也會得到提升。
拓展資料:
十字鏈表(Orthogonal List)是有向圖的另一種鏈式存儲結構。可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的一種鏈表。在十字鏈表中,對應於有向圖中每一條弧都有一個結點,對應於每個定頂點也有一個結點。
十字鏈表之於有向圖,類似於鄰接表之於無向圖。
也可以理解為 將行的單鏈表和列的單鏈表結合起來存儲稀疏矩陣稱為十字鏈表, 每個節點表示一個非零元素。
三元組解釋:
1、所謂「三元組」是指圖形的幾何元素構成、圖線間的拓撲關系和尺寸約束。如果一組圖形的前二元相同而只是尺寸大小不同,則這組圖形構成一族形狀相同的系列化圖形。
2、把組成一個元素的三個數稱為三元組。一個三元組包含以下三部分的內容SDO_STARTING_OFFSET表明每個幾何元素的第一個坐標在SDO_ORDINATES數組中的存儲位置。
3、…Mt:N2)的表示稱為三元組...…Mt稱為標號,N1、N2為結點R為關系。當n≠0時,稱Li為對結點N1的修飾。t≠0時,稱Mj為對結點N2的修飾。
參考資料:網路:十字鏈表
網路:三元組