文章目录

  • 一、拓扑排序(Topological Sort)
    • 实现思路
  • 二、强连通分支
    • 1. 转置的概念
    • 2. 强连通分支算法:Kosaraju算法思路
  • 三、最短路径问题
    • 1. 最短路径问题:Dijkstra算法
    • 2. python代码实现
    • 3. Dijkstra算法分析
  • 四、最小生成树
    • 1. 单播解法
    • 2. 洪水解法
    • 3. 最小生成树解法
    • 4. Prim算法

一、拓扑排序(Topological Sort)

很多问题都可转化为图, 利用图算法解决,例如制作煎饼的过程,以动作为顶点,以先后次序为有向边。

但问题是如果一个人独自做,所有动作的先后次序是什么?从加料开始?还是从加热烤盘开始?

从工作流程图得到工作次序排列的算法,称为“拓扑排序”。拓扑排序处理一个DAG(有向无圈图),输出顶点的线性序列。使得两个顶点v,w,如果G中有(v,w)边,即从顶点v到顶点w,那么在线性序列中v就出现在w之前。比如,在上图中“pour 1/4 cup”在“turn when bubbly之前”。

拓扑排序广泛应用在依赖事件的排期上,还可以用在项目管理、数据库/查询优化和矩阵乘法的次序优化上……

实现思路

拓扑排序可以采用DFS很好地实现:

  1. 将工作流程建立为图,工作项是节点,依赖关系是有向边;
  2. 工作流程图一定是个DAG图,否则有循环依赖;
  3. 对DAG图调用DFS算法,以得到每个顶点的“结束时间”;
  4. 按照每个顶点的“结束时间”从大到小排序;
  5. 输出这个次序下的顶点列表。

制作煎饼的步骤顺序(其中一种)

二、强连通分支

我们先看一张非常巨大的图:由网页通过超链接连接而形成的图。以网页(URI作为id)为顶点,网页内包含的超链接作为边,可以转换为一个有向图。

美国路德学院计算机系网站链接情况,有三个有趣的现象:

  • 图中包含了许多路德学院其它系的网站;
  • 包含了一些爱荷华其它大学学院的网站;
  • 还包含了一些人文学院的网站。

我们可以猜想,Web的底层结构可能存在某些同类网站的聚集在图中发现高度聚集节点群的算法,即寻找“强连通分支(Strongly Connected Components)”算法

强连通分支,定义为图G的一个子集C,C中的任意两个顶点v,w之间都有路径来回,即(v,w)(w,v)都是C的路径,而且C是具有这种性质的最大子集。

下图是具有3个强连通分支的9顶点有向图,一旦找到强连通分支,可以据此对图的顶点进行分类,并对图进行化简。

1. 转置的概念

在用深度优先搜索来发现强连通分支之前,先熟悉一个概念:Transposition转置。

一个有向图G的转置GT\text G^ \text TGT,定义为将图G的所有边的顶点交换次序,如将(v,w)转换为(w,v),可以观察到图和转置图在强连通分支的数量和划分上,是相同的。比如下图:

2. 强连通分支算法:Kosaraju算法思路

  1. 首先,对图G调用DFS算法,为每个顶点计算“结束时间”;
  2. 然后,将图G进行转置,得到GT\text G^ \text TGT;
  3. 再对GT\text G^ \text TGT调用DFS算法,但在dfs函数中,对每个顶点的搜索循环里,要以顶点的“结束时间”倒序来搜索;
  4. 最后,深度优先森林中的每一棵树就是一个强连通分支。

算法实例:

  • 第一趟DFS:

  • 转置后第二趟DFS:

    从原来结束时间最大的A(18)开始,第一个子图探索完成后,开始从剩余顶点中的原来结束时间最大的C(10)开始……接着是F(9)……

  • 结果:

Kosaraju算法最好理解,但是效率最差,因此另外的常用强连通分支算法有:Tarjan算法、Gabow算法(对Tarjan的改进)。感兴趣可以自行搜索了解。

三、最短路径问题

当我们通过网络浏览网页、 发送电子邮件、 QQ消息传输的时候, 数据会在联网设备(以路由器为例)之间流动,不同的路径花费的代价不同。这些是《计算机网络原理》的内容,在此不做赘述,这里我们只关心其中包含的图算法。如何通过图算法,找到代价最小或者说传播速度最快的路径?

我们可以将网络设备体系表示为一个带权边的图:

  • 路由器作为顶点,路由器之间网络连接作为边;
  • 权重可以包括网络连接的速度、网络负载程度、分时段优先级等影响因素;
  • 作为一个抽象,我们把所有影响因素合成为单一的权重。

解决数据在路由器网络中选择传播速度最快路径的问题, 就转变为在带权图上最短路径的问题。这个问题与广度优先搜索BFS算法解决的词梯问题相似, 只是在边上增加了权重

1. 最短路径问题:Dijkstra算法

解决带权最短路径问题的经典算法是以发明者命名的“迪杰斯特拉(Dijkstra)算法”。这是一个迭代算法,得出从一个顶点到其余所有顶点的最短路径,很接近于广度优先搜索算法BFS的结果。

具体实现上,在顶点Vertex类中的成员dist用于记录从开始顶点到本顶点的最短
带权路径长度(权重之和),算法对图中的每个顶点迭代一次。

  • 顶点的访问次序由一个优先队列来控制,队列中作为优先级的是顶点的dist属性;

  • 最初,只有开始顶点dist设为0,而其他所有顶点dist设为sys.maxsize(最大整数),全部加入优先队列;

  • 随着队列中每个最低dist顶点率先出队;

  • 并计算它与邻接顶点的权重,会引起其它顶点dist的减小和修改,引起堆重排;

  • 并据更新后的dist优先级再依次出队。

算法实例:

  1. 设u为开始顶点,计算与u相连的其他顶点的权重,并将u出队;
  2. 更新v,x的权重,将较小的x(d=1)出队;
  3. 计算与x相连的v,w,y的权重,v:1+2=3 > 2,因此不更新权重,其余的更新,然后将最小的v出队;
  4. 同时y(d=2)也出队,计算与之相连的w,z,并更新w,z;
  5. 将w,z出队。

2. python代码实现

form pythonds.graphs import Graph,PriorityQueue,Vertexdef dijkstra(aGraph, start):pq = PriorityQueue()# 起点的距离设置为0start.setDistance(0)# 对所有顶点建堆,形成优先队列pq.buildHeap([(v.getDistance(), v) for v in aGraph])while not pq.isEmpty():# 优先队列出队currentVert = pq.delMin() # 更新相邻顶点的距离值for nextVert in currentVert.getConnections():newDist = currentVert.getDistance() + currentVert.getWeight(nextVert)if newDist < nextVert.getDistance():# 修改出队顶点所邻接顶点的dist,并逐个重排队列nextVert.setDistance(newDist)nextVert.setPred(currentVert)# 重新排列优先队列pq.decreaseKey(nextVert, newDist)

需要注意的是,Dijkstra算法只能处理大于0的权重,如果图中出现负数权重,则算法会陷入无限循环。

虽然Dijkstra算法完美解决了带权图的最短路径问题,但实际上Internet的路由器中采用的是其它算法

数据结构与算法——31. 图的应用:拓扑排序、强连通分支、最短路径问题、最小生成树相关推荐

  1. 数据结构与算法之-----图(拓扑排序)

    [​​​​​​​ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据 ...

  2. 数据结构与算法之-----图(搜索算法)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己 ...

  3. 数据结构与算法之图的应用

    数据结构与算法之图的应用 图的定义和基本概念 图的实现 数组〈邻接矩阵〉 邻接表 图的应用 最小生成树 Prim(普里姆)算法 Kruskal(克鲁斯卡尔)算法 最短路径 迪克斯特拉算法 拓扑排序 执 ...

  4. python函数结构图_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  5. python define graph_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  6. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  7. 特征图注意力_从数据结构到算法:图网络方法初探

    作者 | 朱梓豪 来源 | 机器之心 原文 | 从数据结构到算法:图网络方法初探 如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入. ...

  8. 数据结构与算法--符号图

    数据结构与算法--符号图 为了计算简单,传统的图中,都是使用整数来表示顶点,这样难免会有点抽象,不能直接反映各个顶点代表的信息.在实际生活中,使用图时一般会建立一个一一对应的关系表,如下 顶点 0 1 ...

  9. 算法高级(33)-拓扑排序-maven依赖关系的确定

    一.拓扑排序(Topological Sorting) 1.定义 拓扑排序是一种图论算法,该算法在<数据结构与算法>一书中有涉猎.引用维基百科的定义:在图论中,由一个有向无环图的顶点组成的 ...

最新文章

  1. 卡顿严重_王者峡谷:S20出现bug?卡顿十分严重
  2. [转]微信小程序开发需要注意的29个坑
  3. 漫画:如何实现大整数相加
  4. cygwin开发环境搭建与apt-cyg的应用
  5. 中国联通官网被发现含木马脚本,可向用户推广色情APP
  6. facebook, twitter,QQ, google +1, linkedin, disqus,gigya 按钮Network (登录)
  7. 图像识别(2)—验证码篇
  8. div+css与table布局
  9. 嵌入式电路设计(stm32电路设计)
  10. Python入门语法知识点合集
  11. 采药2 (Standard IO)
  12. JavaWEB开发国际化
  13. typescript面试题_vue 248+个知识点(面试题)为你保驾护航
  14. Abp Quartz配置Sqlite
  15. flash activex java_adobe flash player activex
  16. 硅谷华人天才CEO被开除,是否会有奇迹发生?
  17. proposal中文翻译_PROPOSAL 是什么意思_ PROPOSAL 的翻译_音标_读音_用法_例句_爱词霸在线词典...
  18. 【DL】为什么需要深度学习:模组化、端到端学习(语音识别、图像处理情景)、类比逻辑电路
  19. 智能窗帘控制(光、红外、蓝牙)
  20. Android仿拼多多拼团堆叠头像

热门文章

  1. 2021-09-03剑指Offer51.数组中的逆序对
  2. 豆瓣走进校招,Web 2.0 站稳脚跟?
  3. HP430,没有可比性的性能对比
  4. 三次考博经历学长精心整理的博士申请视频合集
  5. 解决SQLSever配置管理器不见了
  6. 神经网络框架及相关信息收集
  7. 关于科讯cms商城系统的求教
  8. socket编程TCP程序
  9. go 之 浮点数相等判断
  10. webman 报错解决手册