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 相关文章推荐
Pyhton中防止SQL注入的方法
Feb 05 Python
用Python脚本来删除指定容量以上的文件的教程
May 04 Python
Python实现自动发送邮件功能
Mar 02 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
python实现求纯色彩图像的边框
Apr 08 Python
Python中使用ipython的详细教程
Jun 22 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
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
学习python (1)
2006/10/31 Python
Django的信号机制详解
2017/05/05 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
python实现证件照换底功能
2019/08/20 Python
wxPython实现带颜色的进度条
2019/11/19 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
python时间time模块处理大全
2020/10/25 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
《中华少年》教学反思
2014/02/15 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书