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 相关文章推荐
使用graphics.py实现2048小游戏
Mar 10 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
浅谈Python的异常处理
Jun 19 Python
Python全局变量用法实例分析
Jul 19 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
Python字符串处理实现单词反转
Jun 14 Python
Python3 queue队列模块详细介绍
Jan 05 Python
Python登录注册验证功能实现
Jun 18 Python
Python基础学习之函数方法实例详解
Jun 18 Python
Python 异常处理Ⅳ过程图解
Oct 18 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 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
基于PHP静态类的原罪详解
2013/05/06 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
Python字符转换
2008/09/06 Python
python错误处理详解
2014/09/28 Python
Python中使用SAX解析xml实例
2014/11/21 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
python 动态调用函数实例解析
2019/10/21 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
《狼和小羊》教学反思
2014/04/20 职场文书
元旦标语大全
2014/10/09 职场文书
申报优秀教师材料
2014/12/16 职场文书
西安兵马俑导游词
2015/02/02 职场文书
行政文员岗位职责
2015/02/04 职场文书
首次购房证明
2015/06/19 职场文书