em演算法 稀疏矩陣 稀疏矩陣的快速轉置原理及其演算法

2021-10-18 08:12:38 字數 1849 閱讀 9866

關於稀疏矩陣的快速轉置法,首先得明白其是通過對三元表進行轉置。如果誤以為是對矩陣進行轉置,毫無疑問就算你想破腦袋也想不出個所以然,別陷入死胡同了!

對於乙個三元表,行為i,列為j,值為v。需將其i與j的值對調才能得到新的三元表,但是如果直接進行轉換,得到的新的三元表的順序是混亂的,不符合三元表的規則。所以,課本首先介紹了乙個用掃瞄來轉置的演算法(這個演算法比較容易,在這裡我就不說了),但是這個轉置演算法的時間複雜度太高,於是就有了接下來的快速轉置演算法。

要你對乙個三元表進行步驟最少的轉置,你可能會想,如果知道三元表中每一項在轉置後的新的三元表中的位置,然後直接放進去,豈不是極大的縮小了時間複雜度?沒錯!快速轉置法正是基於這種思想而設計的。

那麼如何知道三元表中某一項的位置呢?在課本98頁的a.data這個三元表可以看到,j為列號,在轉置後即為新的三元表的行號,三元表正是按照行序進行排列的,而j=1有2個、j=2有2個、j=3有2個、j=4有1個、j=6有1個。根據這些資料按照從小到大排列,j=1的項在新的三元表中應佔據第1、2位,j=2的項在新的三元表中應佔據第3、4位,j=3的項在新的三元表中應佔據第5、6位,j=4應佔據第7位,j=6應佔據第8位。

接下來就輕鬆多了,轉置的時候直接從第一項讀起,讀取其j值,比如課本中a.data這個三元表的第一項的j值為2,因為j=2佔據第3、4位,所以應該從第三位開始放,接下來如果讀取的某一項的j值也是2,就放在第4位。因為j=2的項只有兩個,所以第5位絕對不會被j=2的項佔據,第5、6項本來就是留給j=3的。再比如當讀到j=6的那項時,第8位是留給它的,就可以直接放進第8位了。這樣,讀取每一項,都能在三元表中找到相應的位置,這就是稀疏矩陣快速轉置的原理。

當然,上面只是快速轉置的原理,要實現它,就要設計演算法來實現了。首先,我們需要兩個變數。第乙個num[col]用於記錄原三元表中列數為col的項的數目,例如col=3時,num[col]=2;第二個cpot[col]用於記錄原三元表中列數為col的項在新三元表中的首位置,例如col=3時,cpot[col]=5。你可以開啟書本第99頁,我想你現在應該是能看懂表5.1了吧。

接下來說一說快速轉置演算法的具體事項,在課本的100頁**如下:

逐句解釋:

#include#define number 10

typedef struct triple;

typedef struct tsmatrix;

int fasttransposesmatrix(tsmatrix m, tsmatrix& t) // for

} // if

return 0;

} // fasttransposesmatrix

int main()

【lb】稀疏矩陣的快速轉置原理及其演算法_poklau的專欄-csdn部落格​blog.csdn.net

矩陣(稀疏矩陣)的轉置演算法(c語言)詳解​c.biancheng.net

稀疏矩陣演算法

1 稀疏矩陣的壓縮儲存 為了節省儲存單元,可只儲存非零元素。由於非零元素的分布一般是沒有規律的,因此在儲存非零元素的同時,還必須儲存非零元素所在的行號 列號,才能迅速確定乙個非零元素是矩陣中的哪乙個元素。稀疏矩陣的壓縮儲存會失去隨機訪問功能。其中每乙個非零元素所在的行號 列號和值組成乙個三元組 i,...

稀疏矩陣的快速轉化

若有下面這樣乙個矩陣001 3056 700 如果按照上篇所用的資料結構儲存如下 a rowcolvalue s 0 02 1s 1 03 3s 2 10 5s 3 11 6s 4 12 7 轉換後的 b rowcolvalue s 0 01 5s 1 11 6s 2 20 1s 3 21 7s 4...

特殊矩陣 稀疏矩陣

對於乙個m n的矩陣,設s為矩陣的元素總個數s m n,設t為矩陣中非零元素的個數,滿足t 稀疏矩陣的零元素非常多,且分布無規律,所以稀疏矩陣的壓縮儲存方法為 只儲存矩陣中的非零元素,按照三元組的形式儲存。三元組由非零元素,該元素行下標和該元素列下標三個資料構成,放在乙個列數為3的陣列中。儲存結構又...