拓普排序介绍
拓撲排序介紹
拓撲排序(Topological Order)是指,將一個有向無環圖(Directed Acyclic Graph簡稱DAG)進行排序進而得到一個有序的線性序列。
這樣說,可能理解起來比較抽象。下面通過簡單的例子進行說明!?
例如,一個項目包括A、B、C、D四個子部分來完成,并且A依賴于B和D,C依賴于D。現在要制定一個計劃,寫出A、B、C、D的執行順序。這時,就可以利用到拓撲排序,它就是用來確定事物發生的順序的。
在拓撲排序中,如果存在一條從頂點A到頂點B的路徑,那么在排序結果中B出現在A的后面。
?
拓撲排序的算法圖解
拓撲排序算法的基本步驟:
1.?構造一個隊列Q(queue) 和 拓撲排序的結果隊列T(topological);?
2.?把所有沒有依賴頂點的節點放入Q;?
3.?當Q還有頂點的時候,執行下面步驟:?
3.1?從Q中取出一個頂點n(將n從Q中刪掉),并放入T(將n加入到結果集中);?
3.2?對n每一個鄰接點m(n是起點,m是終點);?
3.2.1?去掉邊<n,m>;?
3.2.2?如果m沒有依賴頂點,則把m放入Q;?
注:頂點A沒有依賴頂點,是指不存在以A為終點的邊。
以上圖為例,來對拓撲排序進行演示。
第1步:將B和C加入到排序結果中。?
????頂點B和頂點C都是沒有依賴頂點,因此將C和C加入到結果集T中。假設ABCDEFG按順序存儲,因此先訪問B,再訪問C。訪問B之后,去掉邊<B,A>和<B,D>,并將A和D加入到隊列Q中。同樣的,去掉邊<C,F>和<C,G>,并將F和G加入到Q中。?
????(01) 將B加入到排序結果中,然后去掉邊<B,A>和<B,D>;此時,由于A和D沒有依賴頂點,因此并將A和D加入到隊列Q中。?
????(02) 將C加入到排序結果中,然后去掉邊<C,F>和<C,G>;此時,由于F有依賴頂點D,G有依賴頂點A,因此不對F和G進行處理。?
第2步:將A,D依次加入到排序結果中。?
????第1步訪問之后,A,D都是沒有依賴頂點的,根據存儲順序,先訪問A,然后訪問D。訪問之后,刪除頂點A和頂點D的出邊。?
第3步:將E,F,G依次加入到排序結果中。
因此訪問順序是:B -> C -> A -> D -> E -> F -> G
拓撲排序的代碼說明
拓撲排序是對有向無向圖的排序。下面以鄰接表實現的有向圖來對拓撲排序進行說明。
總結
- 上一篇: JEECG_3.7开发环境搭建与代码生成
- 下一篇: 使用proguard混淆java web