[MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度優先搜索,拓撲排序


一、深度優先搜索

它的定義是:遞歸探索圖,必要時要回溯,同時避免重復。

 

關於深度優先搜索的偽代碼如下:

左邊DFS-Visit(V, Adj.s)是只實現visit所有連接某個特定點(例如s)的其他點。右邊是實現整張圖的visit,即DFS(v, Adj)。DFS-Visit是DFS的重要組成模塊。

用上圖右側的實例圖解釋下運作過程:

  • 先從a出發,DFS-Visit到b上。
  • 遞歸到b上,從b出發,DFS-Visit到e上。
  • 遞歸到e上,從e出發,DFS-Visit到d上。
  • 遞歸到d上,從d出發,本來是要DFS-Visit到b上的,因為DFS要避免重復,所以這里就斷了。
  • 由於b已經被visit過了,現在從c出發,DFS-Visit到f上。
  • f不能visit自己,且e被visit過了,這里就斷了。
  • 之后c,d,e,f都被visit過了,所有就完成了。

DFS的時間復雜度如下(這里不做多余的解釋):

 

二、邊分類

Edge Classification可以解決兩個問題:cycle detection和topological sort。

它有四種邊:

  • tree edge:即帶有parent pointer的邊,通過該邊可以visit到新的點。
  • forward edge:點到樹中的子輩。
  • backward edge:點到樹中的父輩。
  • cross edge:在兩個無父輩關系的子樹之間。

(如果是無向圖,只存在tree edge和backward edge)

 

三、循環檢測

如果圖G有個循環,那么DFS就存在反向邊back edge。反過來也成立,即如果DFS就存在反向邊back edge,圖G就有個循環。

 

四、拓撲排序

在Job scheduling問題上,給定有向非循環圖(DAG),排序點使得所有變從低位指向高位。這里使用拓撲排序Topological sort可以實現:使用DFS,然后反着輸出點的完成時間。這這里面有個常理就是對於任何從u到v的邊即e =(u,v),都滿足v完成早於u完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM