稀疏矩陣的壓縮

2021-07-12 04:30:39 字數 2447 閱讀 1145

稀疏矩陣的特點

m*n矩陣,矩陣中有效值的個數遠遠小於無效值的個數,並且這些資料的分布沒有規律。

例如下面的矩陣

稀疏矩陣的壓縮儲存

壓縮矩陣值儲存極少數的有效資料。使用三元組來儲存每乙個資料,三元組資料按照矩陣中的位置,以行優先順序依次存放。

則上述矩陣的儲存結構為

三元組結構

//三元組的定義

templatestruct  triple

//建構函式

triple(const t& d,size_t row=0,size_t col=0)

:_value(d)

,_row(row)

,_col(col)

{}public:

t _value;//資料域

size_t _row;//行

size_t _col;//列

};

稀疏矩陣的壓縮

templateclass sparsematrix

sparsematrix(const t* a, size_t row, size_t col, const t& invalid);

void display();//列印

sparsematrixtransport();//列轉置

sparsematrixfasttransport();//快速轉置

private:

vector> _a;//三元組型別的順序表

size_t _rowsize;//行數

size_t _colsize;//列數

t _invalid;//非法值

};//矩陣的壓縮

templatesparsematrix::sparsematrix(const t* a, size_t row, size_t col, const t& invalid)

:_rowsize(row)

, _colsize(col)

, _invalid(invalid)

} }}

轉置將原矩陣的行、列互換,也就是將[row][col]和[col][row]位置上的資料對換。

列轉置演算法思想:

採用按照被轉置矩陣三元組表a的序列(即轉置後三元組表b的行序)遞增的順序進行轉置,並以此送入轉置後矩陣的算遠足表b中,這樣一來,轉置後矩陣的三元組表b恰好是以「行序為主序的」.

實現**

//列轉置

templatesparsematrixsparsematrix::transport()

} }return result;

}

演算法分析:

演算法的時間主要消耗在雙重迴圈中,其時間複雜度為o(_colsize*_a.size)。

一次定位快速轉置

演算法思想:

在列轉置中演算法的時間浪費主要在雙重迴圈中,要改善演算法的效能,必須去掉雙重迴圈,使得整個轉置過程通過一次迴圈來完成。

為了能使得被轉置的三元組表a中元素一次定位到三元組表b中,需要預先計算一下資料:

1)rowcounts,三元組表a中每一列有效值的個數,即轉置後矩陣三元組表b中每一行有效值的個數。

2)rowstart,三元組表b中每一行有效值的起始位置。

rowstart[col]=rowstart[col-1]+rowcounts[col-1]

上述矩陣的兩個陣列為:

**實現:

//快速轉置

templatesparsematrixsparsematrix::fasttransport()

rowstart[0] = 0;

for (size_t i = 1; i 

//快速轉置

size_t index = 0;

tripletmp;

while (index 

delete rowcounts;

delete rowstart;

return result;

}

演算法分析:

一次定位快速轉置演算法時間主要浪費在3個並列的迴圈中,分別執行了_colsize,_col_size,_a.size()次,總的時間複雜度為o(_colsize+_a.size())。遠遠小於o(_colsize*_a.size)。

稀疏矩陣的壓縮矩陣

如果乙個矩陣中的大部分元素為零,稱為稀疏矩陣。對於稀疏矩陣而言,時間儲存的資料項很少,如果在程式中使用傳統的二維陣列方式來儲存,則十分浪費儲存空間,且矩陣越大,資源浪費越嚴重。為提記憶體空間利用率,可利用三項式 3 tuple 的資料結構,即把乙個非零項用 i,j,item value 來表示。其中...

稀疏矩陣壓縮

對於那些零元素數目遠遠多於非零元素數目,並且非零元素的分布沒有規律的矩陣稱為稀疏矩陣 sparse 人們無法給出稀疏矩陣的確切定義,一般都只是憑個人的直覺來理解這個概念,即矩陣中非零元素的個數遠遠小於矩陣元素的總數,並且非零元素沒有分布規律。由於稀疏矩陣中非零元素較少,零元素較多,因此可以採用只儲存...

稀疏矩陣的壓縮儲存

include include using namespace std templateclass sparsematrix sparsematrix 訪問稀疏矩陣中row行col中的元素 t access int row,int col it return invalid for size t i...