python实现拓扑排序的基本教程


Posted in Python onMarch 11, 2018

拓扑排序

几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖关系,这些依赖关系会为它们的执行顺序行程表部分约束。对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acyclic Graph,DAG,无环是一个重要条件),并将寻找其中依赖顺序的过程称为拓扑排序(topological sorting)。

拓扑排序要满足如下两个条件

  • 每个顶点出现且只出现一次。
  • 若A在序列中排在B的前面,则在图中不存在从B到A的路径。

拓扑排序算法

任何无回路的顶点活动网(AOV网)N都可以做出拓扑序列:

  • 从N中选出一个入度为0的顶点作为序列的下一顶点。
  • 从N网中删除所选顶点及其所有的出边。
  • 反复执行上面两个步骤,知道已经选出了图中的所有顶点,或者再也找不到入度为非0的顶点时算法结束。

如果剩下入度非0的顶点,就说明N中有回路,不存在拓扑排序。

存在回路,意味着某些活动的开始要以其自己的完成作为先决条件,这种现象成为活动之间的死锁。一种常见的顶点活动网实例是大学课程的先修课程。课程知识有前后练习,一门课可能以其他课程的知识为基础,学生想选修这门课程时,要看是否已修过所有先修课程。如果存在一个回路的话,那就意味着进入了一个循环,那么该同学就毕不了业了。

因此可以说拓扑排序算法是为了做出满足制约关系的工作安排。

下面我们操作一个实例,如下图是一个有向无环图:

python实现拓扑排序的基本教程

用字典表示: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']

图中有环的情况:

python实现拓扑排序的基本教程

G = { 'a':'bce', 'b':'d','c':'d','d':'e','e':'cd'}

输出结果:

there's a circle.
None

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中生成器和yield语句的用法详解
Apr 17 Python
Python构建XML树结构的方法示例
Jun 30 Python
Python合并多个Excel数据的方法
Jul 16 Python
Python实现FTP文件传输的实例
Jul 07 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
Python decorator拦截器代码实例解析
Apr 04 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
python将图片转为矢量图的方法步骤
Mar 30 Python
Python中else的三种使用场景
Jun 16 Python
Python实现图片尺寸缩放脚本
Mar 10 #Python
TensorFlow平台下Python实现神经网络
Mar 10 #Python
python构建深度神经网络(续)
Mar 10 #Python
python构建深度神经网络(DNN)
Mar 10 #Python
Python使用numpy实现BP神经网络
Mar 10 #Python
python实现日常记账本小程序
Mar 10 #Python
python实现简单神经网络算法
Mar 10 #Python
You might like
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Django配置文件代码说明
2019/12/04 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
人事经理岗位职责
2014/04/28 职场文书
党课培训心得体会
2014/09/02 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
2014全年工作总结
2014/11/27 职场文书
课外活动实习计划
2015/01/19 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
html5表单的required属性使用
2021/07/07 HTML / CSS
SpringBoot快速入门详解
2021/07/21 Java/Android