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传递参数方式小结
Apr 17 Python
Python加pyGame实现的简单拼图游戏实例
May 15 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
pycharm设置注释颜色的方法
May 23 Python
python爬虫 2019中国好声音评论爬取过程解析
Aug 26 Python
wxpython绘制圆角窗体
Nov 18 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
python实现大文本文件分割成多个小文件
Apr 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中防止伪造跨站请求的小招式
2011/09/02 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
XmlUtils JS操作XML工具类
2009/10/01 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
深入理解Python3中的http.client模块
2017/03/29 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
python装饰器练习题及答案
2019/11/01 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
成人继续教育实施方案
2014/03/01 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
课例研修方案
2014/05/31 职场文书
争做文明公民倡议书
2019/06/24 职场文书
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers