DAG(Directed Acyclic Graph簡稱DAG),就是有向無環圖,DAG這種圖中的所有邊都是有向邊,而且從任意一個頂點開始,都找不到回到起始點的環路。
我也不免俗,舉一個例子見下圖:
我們可以對某些,記住是某些DAG圖進行排序:稱為拓撲排序。記住,是某些圖。
至於為什么要排序(或者說排序有什么用),網上很多資料都有解釋(比如要自學某一個課程,可能要首先自學其他很多門必備的基礎課程,拓撲排序可以安排你的學習流程),不再贅述。
所謂拓撲排序,就是把DAG圖的各個節點按照一定的次序輸出,並且保證輸出序列的次序和頂點之間的先后次序一致。比如節點i----->節點j,那么輸出序列中,i必須在j之前。
很熟悉的感覺吧。讓我們想起了有向圖的遍歷,其實有向圖的深度和廣度遍歷的過程,都是一次拓撲排序的過程。
我們知道,遍歷的開始節點可以任意選,但是拓撲排序的起始節點則不能任意選,比如,上面的圖中,我們不能選節點7以外的節點開始排序,這將導致節點7的前驅節點排在節點7之后。
同時,因為選擇起始節點可能不同,還有算法也可能不同(比如排序時候選下一個節點的的nextNBr函數的結果不同:見我的gitee代碼),拓撲排序的結果也必然不是唯一的。
從上面的討論我們也可以得出一個結論:一個可以進行拓撲排序的DAG圖的基本特征,必然存在至少一個入度為0的節點,如此才可以排序.
其實,上面我們討論的,符合一定條件的DAG圖就是AOV網(Active on vertices):中文翻譯就是:用頂點表示活動的網絡。
此處補充說明一下,數據結構中,好像大部分教材將網定義為:邊具有權重的圖。而有的書則說:有向圖就是網。從AOV的特征來看,拓撲排序不涉及邊的權重,因此對於網的定義,需要再次查找資料確認。
DAG的另一個應用就是AOE網。
AOE和AOV名字相近,含義卻不一樣(其實什么含義都是人為賦予的),AOE:就是Active on Edges,用邊表示活動的網。既然名字這么規定,說明AOE的邊有特殊性,比如邊的權重參數能就比較重要,舉例來說:
比如我們要做飯,從開始那一刻,就要處理很多事情(事件),而每一個事件,都要花費時間。這里,用頂點表示事件開始,用邊表示處理這個事件的過程,所花費的時間用邊的權重表示(當然,地圖導航也比較符合AOE的性質,比如多對人馬分別走不同的道路行動,最終匯合在一起),而且,我們在燒水的時候,還可以同時做洗菜,備調料等事件和過程,這些事件和過程,用頂點,邊來描述,就是一個有AOE網,最終我們會用這個AOE網絡計算出:飯菜做好至少需要多久。看下圖:
請問,做成一頓美味的飯至少需要多長時間:顯然,我們不能用AOE圖中最短時間的和作為答案,比如從開始---->熬粥----->一頓美餐,雖然只有23分鍾,但是在此時菜還沒有買回來呢。而買菜--->開始被菜--->開始炒菜-->一頓美餐完成 這條路線顯然才是我們能把飯菜吃到嘴里的最短時間。而經過這個步驟的路徑就是關鍵路徑,關鍵路徑經過的各個邊(活動),就是關鍵活動。
從上述可以看出,關鍵路徑是耗費時間最長的那條路徑。
PS:個人理解,AOE網其實就是人為設計的一個網絡,突出了邊的意義,完全可以用帶權的頂點表示也一樣,這時候,開始頂點和結束頂點的權重為0。中間的頂點代表事件和耗費的時間,邊僅僅表示先后次序。
AOE網通常用於工程項目的進度管理.
AOE網的結構在DAG和AOV的基礎上更進一步( 要求更嚴格),除了有向無環的特征外,它還要求圖中必須只能有一個入度為0(開始點)和出度為0(結束點)的點.