- optimize vt.
使最優化
一、
程式語言:matlab數據結構:
矩陣c(n*n):存儲圖的鄰接矩陣矩陣p(n*n):存儲圖的連通性矩陣二、主要函式
unique:刪除掉矩陣里的重複行,形成新矩陣
size:輸出一個矩陣的行數和列數,本次實驗中只需要輸出矩陣的行數,即在輸出連通分支個數的時候用到。
三、遇到的問題及解決方案
1、沒有找到matlab中對元兩個變數做並集運算的函式,就自己通過加法的方式來轉換。而程式中兩個變數的值分別只能取0和1,那么加法的結果有三種,0、1、2。一開始的思路是如果加法的結果是0,那么並集的結果就是0;如果加法的結果不是0,那么並集的結果就是1。後來,改進了代碼,只寫了一句判斷語句,即如果加法的結果是2,那么並集的結果是1,剩下兩種情況加法的結果和並集的結果相同,無須再增加運算的次數。
2、在輸出部分連通圖的連通分支個數這一模組中,起初的做法是對圖的連通性矩陣再次遍歷,對每一行中不為0的元素取出其列號,之後對這個新矩陣進行比較,把完全相同的兩行歸到一個連通分支內,進而輸出連通分支的個數和每一個連通分支。後來,經過思考,直接運算unique函式即可省略掉這一步,很方便地得到想要的每一個連通分支,並對連通分支的矩陣做一下行數和列數的統計,只輸出其行數,就得到了連通分支的個數。
四、心得體會
這次實驗比較簡單,分別運用了Warshall算法和矩陣冪算法進行運算比較,其中對於Warshall算法還進行了最佳化,並輸出了這3種不同計算方法的不同複雜度。
通過對比,可以看出,Warshall算法比矩陣冪算法的複雜度大大降低了。並運用這種算法,對一個連通圖鄰接矩陣和一個非連通圖鄰接矩陣進行判斷,實驗結果能夠正確判斷出圖的連通性。此外,在程式的最後,使用了unique函式輸出了部分連通圖的連通分支的個數和每一個連通分支。
矩陣冪運算雖然感覺理解起來難度大一點,但是是warshall運算的巧妙版,以矩陣的運算來代替了warshall中的遍歷算法,大大減少了難度。
在最初程式寫完之後,後期又對代碼進行改進,精簡,最佳化,力求在實現相同的功能的前提下,充分利用matlab的內置函式,編寫更短的代碼。