簡體   English   中英

如何存儲稀疏矩陣?

[英]How to store sparse matrix?

我需要在C ++中實現兩種類型的存儲稀疏矩陣:

  • 鏈接列表
  • 數組(有效方式)

空間復雜性在這里非常重要。 有效的方法是什么?

nnz :稀疏矩陣的非零數
row_size :矩陣行號
column_size :矩陣列號
它們的空間復雜性有很多種:

  • 壓縮稀疏行(CSR): 2*nnz + row_size內存數
  • 壓縮稀疏列(CSC): 2*nnz + column_size內存數
  • 坐標格式(COO): 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM