讓我們假設我們有一個simmetric矩陣。在C++中壓縮對稱矩陣
A=
1 2 3
2 6 4
3 4 5
現在,因爲它是simmetric,我們不需要存儲記住所有的數字。我們假設將0放在左下三角形的單元格中。
B =
1 2 3
0 6 4
0 0 5
,如果我想要訪問B中的所有我需要做的0元素的含量爲反轉行和興趣細胞的山坳:
if(i>j) val += L[j][i] // ex: B[1][0] is stored in B[0][1]
(讓我們假設我們的目標是總結所有非存儲元件)
在這一點上,我們只使用右上角的三角形,但我們實際上並沒有節省內存,因爲未使用的元素仍然以0值分配。
一個的方式來保存存儲器是使用向量的向量:
vector<vector<int>> C;
,並相應地調整每一行。
C=
1 2 3
6 4
5
通過這樣艱難的,我們不能用交換技巧了,因爲你可能會注意到,現在空元素在矩陣底部直角三角形。
未分配的值即可:
D=
x x x
x x 2
x 3 4
在這種情況下
我們感興趣的是可以用這個,如果條件被發現的元素:
if(j >= size - i)
現在的問題是確定正確的內容的0個元素。換句話說:
if(j >= size - i) ans += L[?][?]
所以,例如,如果我在I = 1 J = 2我不應該訪問該元件[1] [2],而是爲[0] [2] = 2(依此類推[2] [1] - > [0] [2] = 3,[2] [2] - > [1] [1] = 4)。
怎麼可能實現呢?
什麼問題? – Arnaud
你爲什麼要壓縮你的工作集?除非您正在討論機器限制,否則僅在串行化(對文件,網絡等)時執行軟件壓縮。 –