拓撲排序|Topological Sort類演算法題心得(PYTHON版)
阿新 • • 發佈:2018-11-09
拓撲排序
尋找專案之間依賴順序的過程稱為拓撲排序(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