拓扑排序
寻找项目之间依赖顺序的过程称为拓扑排序(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