[英]How to store sparse matrix?
我需要在C ++中實現兩種類型的存儲稀疏矩陣:
空間復雜性在這里非常重要。 有效的方法是什么?
nnz
:稀疏矩陣的非零數
row_size
:矩陣行號
column_size
:矩陣列號
它們的空間復雜性有很多種:
2*nnz + row_size
內存數 2*nnz + column_size
內存數 3*nnz
內存數 對於空間復雜性:
如果row_size > column_size
,則使用CSC
格式,否則,使用CSR
格式。
對於時間復雜性:
對於CSR
格式,Row將被O(1)
時間索引,Column將被O(log(k))
時間索引,通過二進制搜索Column, k
是該行的非零元素的數量。 因此,值將被O(log(k))
時間索引。
對於COO
格式,值將在O(1)
時間內編入索引。
格式細節
[1] https://en.wikipedia.org/wiki/Sparse_matrix
[2] https://software.intel.com/en-us/node/471374
一種有效的方法是使用哈希映射(對於每一行)的哈希映射(通過列索引存儲每行中的元素)。 然后就可以在O(1)時間內訪問任何元素。
您可以實現所有數值算法,例如僅通過非零元素進行加法和乘法迭代,這將提供比O(N * M)更好的復雜度,其中N和M是矩陣中的列數和行數。
由於矩陣是稀疏的,您只需要存儲填充的單元格。對坐標值的簡單查找應該可以。 理想情況下,您應該使用快速查找的內容,如地圖O(log n)或unordered_map O(1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.