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开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
跟老齐学Python之总结参数的传递
Oct 10 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
Python2与Python3的区别实例总结
Apr 17 Python
Python使用进程Process模块管理资源
Mar 05 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
Python识别处理照片中的条形码
Nov 16 Python
class类在python中获取金融数据的实例方法
Dec 10 Python
pycharm 实现调试窗口恢复
Feb 05 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
PHP的PDO连接讲解
2019/01/24 PHP
javascript 日期常用的方法
2009/11/11 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
小程序实现搜索框
2020/06/19 Javascript
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
Python入门篇之面向对象
2014/10/20 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
运动会稿件100字
2014/02/21 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
先进教师个人总结
2015/02/11 职场文书
导游词之清晏园
2019/11/22 职场文书
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫