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 IDLE加上自动补全和历史功能
Nov 30 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
python仿evething的文件搜索器实例代码
May 13 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
Python之修改图片像素值的方法
Jul 03 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
Jun 11 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
解析PHP的session过期设置
2013/06/29 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
Python3如何解决字符编码问题详解
2017/04/23 Python
python字符串string的内置方法实例详解
2018/05/14 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
python如何写出表白程序
2020/06/01 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
护理专业的自荐信
2013/10/22 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
机械机修工岗位职责
2014/08/03 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
学习十八大标语
2014/10/09 职场文书
假释思想汇报范文
2014/10/11 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL