拓撲排序
幾乎在所有的項目,甚至日常生活,待完成的不同任務之間通常都會存在著某些依賴關系,這些依賴關系會為它們的執行順序行程表部分約束。對于這種依賴關系,很容易將其表示成一個有向無環圖(Directed Acyclic Graph,DAG,無環是一個重要條件),并將尋找其中依賴順序的過程稱為拓撲排序(topological sorting)。
拓撲排序要滿足如下兩個條件
拓撲排序算法
任何無回路的頂點活動網(AOV網)N都可以做出拓撲序列:
如果剩下入度非0的頂點,就說明N中有回路,不存在拓撲排序。
存在回路,意味著某些活動的開始要以其自己的完成作為先決條件,這種現象成為活動之間的死鎖。一種常見的頂點活動網實例是大學課程的先修課程。課程知識有前后練習,一門課可能以其他課程的知識為基礎,學生想選修這門課程時,要看是否已修過所有先修課程。如果存在一個回路的話,那就意味著進入了一個循環,那么該同學就畢不了業了。
因此可以說拓撲排序算法是為了做出滿足制約關系的工作安排。
下面我們操作一個實例,如下圖是一個有向無環圖:

用字典表示:G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'}
代碼實現:
def toposort(graph): in_degrees = dict((u,0) for u in graph) #初始化所有頂點入度為0 vertex_num = len(in_degrees) for u in graph: for v in graph[u]: in_degrees[v] += 1 #計算每個頂點的入度 Q = [u for u in in_degrees if in_degrees[u] == 0] # 篩選入度為0的頂點 Seq = [] while Q: u = Q.pop() #默認從最后一個刪除 Seq.append(u) for v in graph[u]: in_degrees[v] -= 1 #移除其所有指向 if in_degrees[v] == 0: Q.append(v) #再次篩選入度為0的頂點 if len(Seq) == vertex_num: #如果循環結束后存在非0入度的頂點說明圖中有環,不存在拓撲排序 return Seq else: print("there's a circle.")G = { 'a':'bce', 'b':'d', 'c':'d', 'd':'', 'e':'cd'}print(toposort(G))輸出結果:
['a', 'e', 'c', 'b', 'd']
圖中有環的情況:

G = { 'a':'bce', 'b':'d','c':'d','d':'e','e':'cd'}輸出結果:
there's a circle.None
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答