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 相关文章推荐
Python3.x版本中新的字符串格式化方法
Apr 24 Python
python中zip()方法应用实例分析
Apr 16 Python
Python中is与==判断的区别
Mar 28 Python
python递归打印某个目录的内容(实例讲解)
Aug 30 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
python取余运算符知识点详解
Jun 27 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
如何在 Django 模板中输出 "{{"
Jan 24 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
Python基础 括号()[]{}的详解
Nov 07 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隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
javascript 特殊字符串
2009/02/25 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
python爬取音频下载的示例代码
2020/10/19 Python
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
化工机械应届生求职信
2013/11/04 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
社会工作专业自荐信
2014/09/26 职场文书
免职证明样本
2014/10/23 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
员工手册董事长致辞
2015/07/29 职场文书
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS