關於稀疏矩陣的快速轉置法,首先得明白其是通過對三元表進行轉置。如果誤以為是對矩陣進行轉置,毫無疑問就算你想破腦袋也想不出個所以然,別陷入死胡同了!
對於乙個三元表,行為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
稀疏矩陣快速轉置
include include typedef structmatrix typedef int spmatrix 100 3 三元陣列別名 spmatrix a,b 建立兩個三元陣列,a為轉置前,b為轉置後 int pos 1000 num 1000 int getthree matrix s,i...
稀疏矩陣快速轉置
稀疏矩陣的儲存不宜用二維陣列儲存每個元素,那樣的話會浪費很多的儲存空間。所以可以使用乙個一維陣列儲存其中的非零元素。這個一維陣列的元素型別是乙個三元組,由非零元素在該稀疏矩陣中的位置 行號和列號對 以及該元組的值構成。而矩陣轉置就是將矩陣行和列上的元素對換。參考演算法5.1中的具體做法,令mu和nu...
稀疏矩陣的快速轉置
其實這2個 是要求要在程式的前後計算程式的時間複雜度,但我不懂怎麼弄。期中已過,對資料結構的印象就是,太長,記不住。有些道理明明就是懂,可還是不樂意去做,然後以後就在那後悔,最後說,唉,這就是人生,只能這麼過著了。include define maxsize 12500 typedef struct...