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脚本内运行linux命令的方法
Jul 02 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
机器学习的框架偏向于Python的13个原因
Dec 07 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
python re模块findall()函数实例解析
Jan 19 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
Python实现快速计算词频功能示例
Jun 25 Python
浅谈python中的多态
Jun 15 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
模仿OSO的论坛(三)
2006/10/09 PHP
php木马攻击防御之道
2008/03/24 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
JS 建立对象的方法
2007/04/21 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
jQuery操作 input type=checkbox的实现代码
2012/06/14 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
vue实现扫码功能
2020/01/17 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python通过future处理并发问题
2017/10/17 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python3实现微型的web服务器
2019/09/03 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
办公室文秘岗位职责
2013/11/15 职场文书
老师给学生的表扬信
2014/01/17 职场文书
商务日语专业自荐信
2014/04/17 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
团支部建设方案
2014/05/02 职场文书
投资入股协议书
2016/03/22 职场文书
如何基于python实现单目三维重建详解
2022/06/25 Python