Python数据结构10:图,代码表示,DFS、BFS,拓朴排序,迪杰斯特拉,最小生成树,关键路径

本文主要是介绍Python数据结构10:图,代码表示,DFS、BFS,拓朴排序,迪杰斯特拉,最小生成树,关键路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 定义

“图”这个字在中文当中,指代的是图画,但是在英文当中有很多种不同的涵义。
painting:用画刷画的油画
drawing:用硬笔画的素描/线条画
picture:真实形象所反映的画,如照片等,如take picture
image:由印象而来的画,遥感影像做image,因是经过传感器印象而来
figure:轮廓图的意思,某个侧面的轮廓,所以有figure out的说法
diagram:抽象的概念关系图,如电路图、海洋环流图、类层次图
chart:由数字统计来的柱状图、饼图、折线图
map:地图;plot:地图上的一小块
graph:重在由一些基本元素构造而来的图,如点、线段等

我们在数据结构中所说的图是指Graph,由节点构成。
图Graph是比树更为一般的结构,实际上树是一种具有特殊性质的图。

图包含:

  • 顶点 Vertex: key 名称, payload 数据项
  • 边 edge(弧 arc):

图的表示: G = (V, E)

  • G 表示整个图
  • V 是所有顶点的集合
  • E 是所有边的集合

路径 Path:就是从一个顶点到另一个点所走过的路(包含路过的顶点)
如在下图里 Path = (V3, V1, V2, V4)
意思就是从 V3到V4 路过 V1和V2

环 Cycle:第一个点和最后一个点相同的路径,绕着圈走就是环
如下图的Cycle = (V3, V5, V2, V3)

入度:指向这个节点的箭头的个数
出度:这个节点指向别的节点的个数
总度数: 入度和出度的和

如下图, V0的总度数是3, 入度是1,出度是2
V5 的总度数是 4,入度是2,出度也是2

连通:

  • 顶点连通:一个顶点到另一个顶点有路径,他俩就是连通的
  • 连通图:任意两个顶点都连通
  • 连通分量(极大连通子图):对于非连通图,他的一个子图是连通图且这个子图包含子图里面所有的顶点和边时,这个子图就是连通分量(极大连通子图)如下图所示
    在这里插入图片描述
  • 强连通图:强连通图必须是有向图,且当任意一对顶点Vi和Vj 都有 Vi -> Vj 和 Vj -> Vi都连通时,就是强连通图
  • 强连通分量:非强连通图的有向图,其中的强连通子图,就是强连通分量

2. 图的数据结构表示方法

2.1 邻接矩阵 adjacency matrix

V0V1V2V3V4V5
V052
V14
V29
V373
V41
V518

这个图的看法就是 V0 -> V1 = 5

优点:简单
缺点:矩阵里面有很多空出来的地方没写,导致矩阵太稀疏,浪费空间。

2.2 邻接表

左边是主列表,先写明所有的顶点,右边列表中每个元素所包含的内容,id就是节点的名字,adj包含了此顶点的邻接节点和到达此节点的权重。

优点是紧凑高效

3. 图的遍历

3.1 深度优先搜索 DFS deep first search

从顶点出发,一直访问没访问过的当前顶点的邻接点,一轮遍历完后,如果还有没有访问过的顶点,就选他做新的顶点,再来一次遍历

如这个图遍历的过程
A - B - C - E - D 所有的这条路上的邻接点都遍历完了
F 还没遍历过,选他开始再次遍历
F - G
最后的结果就是 A - B - C - E - D - F - G

3.2 广度优先搜索 BFS Breadth-First-Search

按层遍历,开始的顶点是第一层,开始顶点的所有子节点是第二层,第二层的所有子节点是第三层,. . .

先遍历完当前层的所有顶点,再遍历下一层

如这个图,A开始第一层,A的子节点B是第二层,B的子节点们CEF是第三层,第三层的E和F的子节点们DG是第四层。

A - B - C - E - F - D - G

4. 拓扑排序 Topological sort

这个视频讲的很好还简单
拓扑排序!(自讲)
简而言之,就是每次删除入度为0的顶点和它的边,作为所求序列的下一个值。

例如

5. 迪杰斯特拉找最短路径

找图中任意一点到其他点最短路径。每次对所有可见点排序后,选距离最短的。
这个视频讲的很好还简单
【史上最清晰】手写迪杰斯特拉-Dijkstra(考试用)
例如

求解流程:
在这里插入图片描述

圈起来得数字是当前节点的起步代价,没圈起来的是顺序

画表格

6. 最小生成树:普利姆和克鲁斯卡尔

最小生成树实际上时最小代价生成树,就是一个图包含所有节点和尽可能少的边的子图,同时代价最小。有以下两种求法:

  1. Prim普利姆: 从顶点入手
    1.随机选第一个顶点V1
    2.找V1连着的代价的最小的边,此边另个节点设为V2
    3.将 (V1, V2) 看作一个整体,继续找与这个整体相连(即,既可以与V1相连,也可以与V2相连)的最小代价的边,循环这个步骤,直到包含了所有的顶点

普利姆从顶点出发对稠密图更好用。

  1. Kruskal 克鲁斯卡尔
    1.每次选权值最小的边,将顶点相连

克鲁斯卡尔从边出发,对稀疏图更好用

普利姆例子:

求这个图的最小生成树
在这里插入图片描述

普利姆解法:
在这里插入图片描述

带圈的数字,是选定的顶点顺序

克鲁斯卡尔解法:
在这里插入图片描述

带圈的数字是选定的边的顺序

7. 找关键路径

关键路径就是在一个活动图中耗时最长的路径,耗时最长的路径上的活动都完成了,才能保证其他非关键路径的活动都完成。

这个up主讲的可以听懂,可以开2倍速,听起来顺畅一些
关键路径 例题讲解

例题:
在这里插入图片描述

在这里插入图片描述

求这个图的关键路径。

顶点代表事件,边代表活动。
Vo :事件最早开始时间,先求这个。 从第一个顶点,从前往后求,每个顶点的最早开始时间都是路径的权值之和最大的那一条路径。
Vl :事件最晚开始事件,从最后一个顶点,往前减,每个顶点的最晚开始事件,是从后往前减最小的值。
e :活动最早开始时间,从前往后找最大的。
l :活动最晚开始时间,从后往前找最小的。
l-e:就是每个活动可以拖延的时间,等于0的表示不能拖延,是关键路径。

这篇关于Python数据结构10:图,代码表示,DFS、BFS,拓朴排序,迪杰斯特拉,最小生成树,关键路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832236

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地