資料結構 對稱矩陣的壓縮儲存與稀疏矩陣的轉置

2021-07-28 18:46:01 字數 3203 閱讀 4106

對稱矩陣(symmetric matrix)

平時儲存一般矩陣我們都是用的二維陣列,但我們可以看出對稱矩陣上三角與下三角的內容是一樣的。為了節省空間我們採取壓縮儲存的方式,將對稱矩陣的上三角或者下三角的資料儲存在乙個一維陣列裡面。如果對稱矩陣為

n*n的矩陣,我們可以知道壓縮儲存的一維陣列的大小為

n*(n+1)/2

。現在我們用模板類來實現對稱矩陣的壓縮儲存(下面以儲存下三角為例):

#includeusing namespace std;

using namespace std;

templateclass symmetricmatrix

}} }

void printcompressedmatrix()//列印一維陣列

cout << endl;

} void printsymmetricmatrix()//根據儲存的一維陣列列印原對稱矩陣

cout << endl;

} cout << endl;

} ~symmetricmatrix()

protected:

t& _access(size_t i, size_t j)

return _matrix[i*(i + 1) / 2 + j];

}protected:

t *_matrix;//對稱矩陣儲存的一維陣列

size_t _n;

};void test()

, ,

, ,

, };

symmetricmatrixsm((int*)array, 5);

sm.printsymmetricmatrix();

sm.printcompressedmatrix();

}

1、稀疏矩陣的壓縮儲存

稀疏矩陣中大多數據都為

0,而有效資料則很少。若是直接採用二維陣列來儲存稀疏矩陣太浪費儲存空間,而且在運算中也會花費大量時間來計算無效資料

0。因此我們利用三元組(triple

)來記錄有效資料的座標及其值,然後將三元組儲存在乙個一維陣列中。

根據稀疏矩陣壓縮儲存的一位陣列進行轉置形成新的一維陣列。將原稀疏矩陣按列遍歷,並按順序將有效資料放入轉置後新的一維陣列中。如下圖中,先在_matrix中找到1和2,然後將其依次放入tmp._matrix中,以此類推。

從普通轉置方法中我們可以發現稀疏矩陣中有多少有效資料,我們就需要遍歷多少次

_matrix

,這樣會比較浪費空間。那有沒有更快的方法呢?下面我們來介紹稀疏矩陣的快速轉置。

我們定義兩個新的一維陣列

rowcount

和rowpos

,其中rowcount

用來記錄新矩陣每一行(即原矩陣每一列)有效資料的個數,

rowpos

用來記錄轉置後新矩陣每一行第乙個有效資料在新一維陣列中的位置(下標),且每次將資料放入新陣列之後,相應的

rowpos加1

**實現如下:

#includeusing namespace std;

#includetemplatestruct triple//三元組結構,用來記錄有效資料的座標及其值

};templateclass sparsematrix

}} }

void printcompressedmatrix()//列印一維陣列

cout << endl;

} void printsparsematrix()//根據一維陣列列印稀疏矩陣

else

cout << _invalid << " ";

}cout << endl;

} cout << endl;

} sparsematrixtransposematrix(t *a)//稀疏矩陣的普通轉置

}} return tmp;

} sparsematrixfasttransposematrix(t *a)//稀疏矩陣的快速轉置

int *rowpos = new int[_n];//記錄轉置後新矩陣每一行第乙個有效資料在三元組中的位置(下標)

memset(rowpos, 0, sizeof(int)*_n);

size_t i = 0;

rowpos[i] = 0;

for (i = 1; i < _n; i++)

for (size_t i = 0; i < _matrix.size(); i++)

delete rowcount;

delete rowpos;

return tmp;

} ~sparsematrix()

{}protected:

vector> _matrix;//使用vector不用手動開闢空間

size_t _m;

size_t _n;

t _invalid;//非法值,這裡指0

};void test()

, ,

, ,

, };

sparsematrixsp((int*)array, 5, 6, 0);

sp.printsparsematrix();

sparsematrixsm = sp.transposematrix((int*)array);

sm.printsparsematrix();

sm.printcompressedmatrix();

sparsematrixsm = sp.fasttransposematrix((int*)array);

sm.printsparsematrix();

sm.printcompressedmatrix();

}

資料結構例程 對稱矩陣的壓縮儲存及基本運算

本文針對資料結構基礎系列網路課程 5 陣列與廣義表中第2課時特殊矩陣的壓縮儲存。問題 用壓縮形式儲存對稱矩陣,實現下面的操作並測試 void init int b 為n階對稱矩陣初始化儲存資料的一維陣列b int value int b,int i,int j 返回儲存在b m 中,對應二維陣列a ...

資料結構實踐 對稱矩陣的壓縮儲存及基本運算

檔名稱 main.cpp 完成日期 2015年10月30日 版本號 codeblocks 問題描述 用壓縮形式儲存對稱矩陣,實現下面的操作並測試 輸入描述 輸入對稱矩陣 只需要輸入下三角部分即可 程式輸出 見執行結果 include include define n 4 void init int ...

資料結構例程 對稱矩陣的壓縮儲存及基本運算

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!本文針對資料結構基礎系列網路課程 5 陣列與廣義表中第2課時特殊矩陣的壓縮儲存。問題 用壓縮形式儲存對稱矩陣,實現下面的操作並測試 void init int b 為n階對稱矩陣初始化儲存資料的一維陣列bint value int b,int i,...