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 相关文章推荐
Django框架中的对象列表视图使用示例
Jul 21 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
python中sys.argv函数精简概括
Jul 08 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
python对XML文件的操作实现代码
Mar 27 Python
python 数据分析实现长宽格式的转换
May 18 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删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
Vue组件化开发思考
2018/02/02 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
js实现炫酷光感效果
2020/09/05 Javascript
python 从远程服务器下载日志文件的程序
2013/02/10 Python
python元组操作实例解析
2014/09/23 Python
python在非root权限下的安装方法
2018/01/23 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
代码详解django中数据库设置
2019/01/28 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
Shell如何接收变量输入
2012/09/24 面试题
产品质量承诺书范文
2014/03/27 职场文书
空乘英文求职信
2014/04/13 职场文书
运动会新闻报道稿
2015/07/22 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers
索尼ICF-36收音机评测
2022/04/30 无线电