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代码(逐级优化)
May 25 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
Python基于递归实现电话号码映射功能示例
Apr 13 Python
flask入门之表单的实现
Jul 18 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
python super的使用方法及实例详解
Sep 25 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 Python
Python初学者必备的文件读写指南
Jun 23 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中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
深入apache host的配置详解
2013/06/09 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
分析Python中解析构建数据知识
2018/01/20 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
Python表达式的优先级详解
2020/02/18 Python
Python流程控制常用工具详解
2020/02/24 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
留学自荐信
2013/10/10 职场文书
医疗纠纷协议书
2014/04/16 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
交通安全横幅标语
2014/10/07 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
龙猫观后感
2015/06/09 职场文书
《花钟》教学反思
2016/02/17 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang