拓扑排序|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

转载于:https://www.cnblogs.com/phinza/p/9820344.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值