稀疏矩陣的特點
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...