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检测远程端口是否打开的方法
Mar 14 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
python实现接口并发测试脚本
Jun 25 Python
python 数据提取及拆分的实现代码
Aug 26 Python
浅谈pycharm使用及设置方法
Sep 09 Python
pytorch数据预处理错误的解决
Feb 20 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
编写python程序的90条建议
Apr 14 Python
Python面向对象之内置函数相关知识总结
Jun 24 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
jquery $.each()使用探讨
2013/09/23 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
javascript学习之json入门
2016/12/22 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
哈理工毕业生的求职信
2013/12/22 职场文书
教师申诉制度
2014/01/29 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
护理专科学生自荐书
2014/07/05 职场文书
学生打架检讨书
2014/10/20 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
赞美教师的句子
2019/09/02 职场文书
Go归并排序算法的实现方法
2022/04/06 Golang