稀疏矩陣的壓縮儲存和快速逆置

2021-07-31 17:51:54 字數 2551 閱讀 5285

稀疏矩陣啊,就是矩陣中的有效元素很稀疏,稀疏到什麼程度呢?通常認為矩陣中非零元素的總數比上矩陣所有元素總數的值小於等於0.05時,則稱該矩陣為稀疏矩陣(sparse matrix)。

我們想,一少部分的有效元素就占用大部分的位址空間,是不是很浪費,那麼我們就要想辦法讓其不浪費那麼多,就是壓縮儲存。之前我們寫過對稱矩陣的壓縮,那是因為對稱矩陣的分布很有規律,但是再看一眼稀疏矩陣,除了有效元素少一點,也沒有什麼規律,那麼我們就要把這些元素的行和列也儲存進去,也就是定義乙個結構體——三元組。

templatet>

struct trituple //三元組

size_t _row;

size_t _col;

t _data;

};

之後就是具體的壓縮了,也沒什麼難得,只需定義乙個容器,然後將有效元素的三元組儲存進去就行了,在這裡我們選擇的是vector。還原的過程也就是列印。也是用兩個迴圈巢狀,不過這裡需要注意一些細節問題,具體的**中都有注釋。

#include

using

namespace

std;

#include

#include

template

class sparsematrix

size_t _row;

size_t _col;

t _data;

};public:

sparsematrix()

{}// 稀疏矩陣的壓縮儲存

sparsematrix(int* array, size_t row, size_t col, const t& invalid)

: _row(row)

, _col(col)

, _invalid(invalid)}}

}// 訪問稀疏矩陣中row行col中的元素

t& access(int row, int col)

}return _invalid;

}// 還原稀疏矩陣

template

friend ostream& operator

<<(ostream& _cout, sparsematrix& s)

else

//輸出無效資料

cout

<< s._invalid << " ";

}cout

<< endl;

}return _cout;

}// 實現稀疏矩陣的逆置,並給出時間複雜度:列數*有效元素個數

sparsematrixtransprot()

index++;}}

return temp;

}//實現稀疏矩陣的快速逆置,並給出時間複雜度

sparsematrixfasttransprot()

int *padd = new

int[_col];

memset(padd, 0, _col*sizeof(int));

for (size_t i = 1; i < _col; i++)

//放置元素

index = 0;

trituple&t = _vt[index];

while (index<_vt.size())

delete pcount;

delete padd;

return temp;

}// 實現稀疏矩陣的加法操作

sparsematrixoperator+(const sparsematrix& sp)

else

if (iladd > iradd)

else}}

if (!_vt.empty())

while (ir < _vt.size())

}return sum;

}private:

vector

> _vt; //用vector來儲存有效資料的三元組

size_t _row;//稀疏矩陣的行數

size_t _col;//稀疏矩陣的列數

t _invalid;//無效值

};void funtest()

, ,,,

,};

int a1[6][5] = ,,,

,,

};int a2[6][5] = ,,,

,,

};sparsematrix s((int *)a, 6, 5, 0);

//sparsematrixs1((int *)a1, 6, 5, 0);

//sparsematrixs2((int *)a2, 6, 5, 0);

cout

<< s << endl;//稀疏矩陣還原

//coutcout

<< s.fasttransprot() << endl;

//cout << s1 << endl;

//cout << endl << s1 << endl;

//cout << endl<< s1 + s2 << endl;

}int main()

稀疏矩陣的壓縮儲存和轉置

稀疏矩陣的特點 零元多,非零元遠少於零元,儲存資料沒什麼規律 因此可以採用只儲存非零元素的方法來進行壓縮儲存 為了節省空間 所以在進行壓縮儲存的時侯需要儲存非零元素值的同時還要儲存非零元素在矩陣中的位置,即非零元素所在的行號和列號,也就是在儲存某個元素比如aij的值的同時,還需要儲存該元素所在的行號...

稀疏矩陣的壓縮儲存及轉置

稀疏矩陣的壓縮儲存及轉置 include using namespace std 三元組順序表的型別定義 define itemsize 100 typedef struct int row,col int item thnode typedef struct thnode data data 0 ...

稀疏矩陣的壓縮儲存與轉置

稀疏矩陣 m n的矩陣,矩陣中有效值的個數 遠小於無效值的個數,且這些資料的分布沒有規律。1 0 3 0 5 0 0 0 0 0 0 0 0 0 0 2 0 4 0 6 0 0 0 0 0 0 0 0 0 0 稀疏矩陣的壓縮儲存 壓縮儲存值儲存極少數的有效資料。使用 三元組儲存每乙個有效資料,三元組...