1. 程式人生 > >拓撲排序|Topological Sort類演算法題心得(PYTHON版)

拓撲排序|Topological Sort類演算法題心得(PYTHON版)

拓撲排序

尋找專案之間依賴順序的過程稱為拓撲排序(topological sorting)。


 

首先要了解有向無環圖|Directed Acyclic Graph

用字典表示:G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'}

Key為value的前置條件(滿足其一即可)

粗略解釋來說就是: 訪問bce前需要訪問a, 訪問d前需要訪問b, 訪問d前需要訪問c, 訪問cd前需要訪問e。

就像是選課一樣,先上101,才能上201.


 

之後要了解入度表|In_degrees

入度表能夠表示所有Key的入度數。

何為入度數?

大白話來講就是“可作為其前置條件的數量”

在G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'}這個例子中:

入度表即為:in_degree = {'a':0, 'b':1, 'c':2, 'd': 3, 'e':1}

解釋一下就是:a的入度為0,因為它沒有前置條件,所以它必然是整個環的起點;b和e的入度均為1(都是從a來的),c的入度為2(它可以從a or e過來)。。。

畫個圖可以更好理解。


 

做法:

1.先建立Graph,其為有向無環圖。

2.建立入度表,得出每個Key的入度。

3.將入度為0的key放到result首位。

以下待修改

4.再把下一個沒有上一位key後入度為0的key加入result。

5.迴圈上一步,直到result被填滿所有key。


 

python公式模板:

def toposort(graph): #如果沒有現成的Graph,就要自己想辦法造一個出來   in_degrees = dict ((u, 0 ) for u in graph) #初始化所有頂點入度為0   for u in graph:    for v in graph[u]:
    in_degrees[v] + = 1  #計算每個頂點的入度,對應的key每在graph[u]裡被提到一次,入度就+1  start   = [u for u in in_degrees if in_degrees[u] = = 0 ] # 篩選入度為0的頂點  result   = []   while start :    u = start .pop()  #預設從最後一個刪除   result .append(u)    for v in graph[u]:     in_degrees[v] - = 1  #類似之前,對應的key每在graph[u]裡被提到一次,入度就-1
    if in_degrees[v] = = 0     start .append(v)   #再次篩選入度為0的頂點    return result G = {   'a' : 'bce' ,   'b' : 'd' ,   'c' : 'd' ,   'd' :'',   'e' : 'cd' } print (toposort(G))   結果為: ['a', 'e', 'c', 'b', 'd']

 

 參考資料:

Python實現拓撲排序的基本教程,趙潔鈺Amy,2018年03月11日,指令碼之家,https://www.jb51.net/article/136203.htm