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中的闭包
Nov 30 Python
python实现多线程抓取知乎用户
Dec 12 Python
深入理解Django中内置的用户认证
Oct 06 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
python add_argument()用法解析
Jan 29 Python
python 的topk算法实例
Apr 02 Python
Python unittest框架操作实例解析
Apr 13 Python
django rest framework serializers序列化实例
May 13 Python
Python如何把十进制数转换成ip地址
May 25 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
Python并发编程实例教程之线程的玩法
Jun 20 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 版本]
2007/03/20 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
wxpython实现图书管理系统
2018/03/12 Python
python实现年会抽奖程序
2019/01/22 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
家长会学生家长演讲稿
2013/12/29 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
计算机实训报告范文
2014/11/05 职场文书
仓库管理员岗位职责
2015/02/03 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
关于保护环境的建议书
2019/06/24 职场文书