数据结构——F/图

一、图的基本概念

图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中:
顶点集合V = {x|x属于某个数据对象集}是有穷非空集合;
E = {(x,y)|x,y属于V}或者E = {<x, y>|x,y属于V && Path(x, y)}是顶点间关系的有穷集合,也叫做边的集
合。
(x, y)表示x到y的一条双向通路,即(x, y)是无方向的;Path<x, y>表示从x到y的一条单向通路,即Path<x, y>
是有方向的。
顶点和边:图中结点称为顶点,第i个顶点记作vi。两个顶点vi和vj相关联称作顶点vi和顶点vj之间有一条边,
图中的第k条边记作ek,ek = (vi,vj)或<vi,vj>。
有向图和无向图:在有向图中,顶点对<x, y>是有序的,顶点对<x,y>称为顶点x到顶点y的一条边(弧),<x,
y>和<y, x>是两条不同的边,比如下图G3和G4为有向图。在无向图中,顶点对(x, y)是无序的,顶点对(x,y)
称为顶点x和顶点y相关联的一条边,这条边没有特定方向,(x, y)和(y,x)是同一条边,比如下图G1和G2为
无向图。注意:无向边(x, y)等于有向边<x, y>和<y, x>。
 

二、图的存储结构

因为图中既有节点,又有边(节点与节点之间的关系),因此,在图的存储中,只需要保存:节点和边关系即可。节点保存比较简单,只需要一段连续空间即可,那边关系该怎么保存呢?
 

2.1 邻接矩阵

因为节点与节点之间的关系就是连通与否,即为0或者1,因此邻接矩阵(二维数组)即是:先用一个数组将定点保存,然后采用矩阵来表示节点与节点之间的关系。
 

2.2 邻接表

邻接表:使用数组表示顶点的集合,使用链表表示边的关系。

1. 无向图邻接表存储
 

注意:无向图中同一条边在邻接表中出现了两次。如果想知道顶点vi的度,只需要知道顶点vi边链表集合中结点的数目即可。
 

2. 有向图邻接表存储
 

三、图的遍历

给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶点仅被遍历一次。"遍历"即对结点进行某种操作的意思。 请思考树以前是怎么遍历的,此处可以直接用来遍历图吗?为什么?
 

3.1 图的广度优先遍历
 

3.2 图的深度优先遍历
 

四、最小生成树

连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树 就不在连
通;反之,在其中引入任何一条新边,都会形成一条回路。
若连通图由n个顶点组成,则其生成树必含n个顶点和n-1条边。因此构造最小生成树的准则有三 条:
1. 只能使用图中的边来构造最小生成树
2. 只能使用恰好n-1条边来连接图中的n个顶点
3. 选用的n-1条边不能构成回路
构造最小生成树的方法:Kruskal算法和Prim算法。这两个算法都采用了逐步求解的贪心策略。
贪心算法:是指在问题求解时,总是做出当前看起来最好的选择。也就是说贪心算法做出的不是整体 最优的
的选择,而是某种意义上的局部最优解。贪心算法不是对所有的问题都能得到整体最优解。
 

4.1 Kruskal算法

任给一个有n个顶点的连通网络N={V,E},
首先构造一个由这n个顶点组成、不含任何边的图G={V,NULL},其中每个顶点自成一个连通分量,
其次不断从E中取出权值最小的一条边(若有多条任取其一),若该边的两个顶点来自不同的连通分量,则将此边加入到G中。
如此重复,直到所有顶点在同一个连通分量上为止。
核心:每次迭代时,选出一条具有最小权值,且两端点不在同一连通分量上的边,加入生成树。
 

4.2 Prime算法
 

五、最短路径

最短路径问题:从在带权图的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径各边的权值总
和达到最小。

5.1单源最短路径--Dijkstra算法

单源最短路径问题:给定一个图G = ( V , E ) G=(V,E)G=(V,E),求源结点s ∈ V s∈Vs∈V到图中每个结点v
∈ V v∈Vv∈V的最短路径。Dijkstra算法就适用于解决带权重的有向图上的单源最短路径问题,同时算法要
求图中所有边的权重非负。一般在求解最短路径的时候都是已知一个起点和一个终点,所以使用Dijkstra算法
求解过后也就得到了所需起点到终点的最短路径。
针对一个带权有向图G,将所有结点分为两组S和Q,S是已经确定最短路径的结点集合,在初始时为空(初始
时就可以将源节点s放入,毕竟源节点到自己的代价是0),Q 为其余未确定最短路径的结点集合,每次从Q
中找出一个起点到该结点代价最小的结点u ,将u 从Q 中移出,并放入S 中,对u 的每一个相邻结点v 进行松
弛操作。松弛即对每一个相邻结点v ,判断源节点s到结点u 的代价与u 到v 的代价之和是否比原来s 到v 的代
价更小,若代价比原来小则要将s 到v 的代价更新为s 到u 与u 到v 的代价之和,否则维持原样。如此一直循
环直至集合Q 为空,即所有节点都已经查找过一遍并确定了最短路径,至于一些起点到达不了的结点在算法
循环后其代价仍为初始设定的值,不发生变化。Dijkstra算法每次都是选择V-S中最小的路径节点来进行更
新,并加入S中,所以该算法使用的是贪心策略。
Dijkstra算法存在的问题是不支持图中带负权路径,如果带有负权路径,则可能会找不到一些路径的最短路
径。
 

5.2 单源最短路径--Bellman-Ford算法

Dijkstra算法只能用来解决正权图的单源最短路径问题,但有些题目会出现负权图。这时这个算法就不能帮助
我们解决问题了,而bellman—ford算法可以解决负权图的单源最短路径问题。它的优点是可以解决有负权
边的单源最短路径问题,而且可以用来判断是否有负权回路。它也有明显的缺点,它的时间复杂度 O(N*E)
(N是点数,E是边数)普遍是要高于Dijkstra算法O(N²)的。像这里如果我们使用邻接矩阵实现,那么遍历所有
边的数量的时间复杂度就是O(N^3),这里也可以看出来Bellman-Ford就是一种暴力求解更新。
 

5.3 多源最短路径--Floyd-Warshall算法

Floyd-Warshall算法是解决任意两点间的最短路径的一种算法。
Floyd算法考虑的是一条最短路径的中间节点,即简单路径p={v1,v2,…,vn}上除v1和vn的任意节点。 设k是p
的一个中间节点,那么从i到j的最短路径p就被分成i到k和k到j的两段最短路径p1,p2。p1是从i到k且中间节
点属于{1,2,…,k-1}取得的一条最短路径。p2是从k到j且中间节点属于{1,2,…,k-1}取得的一条最短路
径。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud openfeign 偶现 Caused by: java.net.UnknownHostException

背景 最近查看日志发现某服务偶现Caused by: java.net.UnknownHostException 同时查看eureka的access.log 出现如下异常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…

第12篇:数据库中间件日志设计与追踪系统落地实践

12.1 引言&#xff1a;中间件日志系统为何如此关键&#xff1f; 数据库中间件作为连接前端应用与后端数据库的“网关”&#xff0c;承载着路由、负载均衡、SQL 改写、权限控制等复杂逻辑。 在出现 性能问题、故障排查、安全审计 等场景中&#xff0c;若没有完善的日志体系&am…

OpenAI对抗法庭命令:捍卫ChatGPT用户隐私之战

人工智能公司OpenAI近期正积极对抗一项涉及隐私问题的法庭命令。该命令要求OpenAI保留所有ChatGPT用户日志&#xff0c;包括已删除的对话记录以及通过API调用生成的聊天内容。 命令背后的真实动机 值得注意的是&#xff0c;法院发布这一指令并非出于对用户隐私或内容安全的考…

嵌入式学习--江协stm32day5

USART 1. 引脚与接口层 异步引脚&#xff1a; TX&#xff1a;发送数据输出&#xff1b;RX&#xff1a;接收数据输入&#xff1b;SW_RX&#xff1a;单线半双工模式的接收引脚&#xff08;替代 RX&#xff09;。 同步引脚&#xff1a;SCLK&#xff1a;同步模式下的时钟输出&…

使用Fiddler抓包

有时候需要跟踪一些小程序的HTTP请求&#xff0c;但是无法像浏览器一样F12查看请求&#xff0c;因此需要借助其他的工具进行&#xff0c;在这里推荐使用Fiddler 配置 此时检查系统代理已经变成如下配置&#xff1a; 抓包 此时随便打开一个小程序&#xff0c;就可以进行抓包…

python学习打卡day47

DAY 47 注意力热图可视化 昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 # 可视化空间注意力热力图&#xff08;显示模型关注的图像区域&#xff09; def visualize_attention_map(model, test_loader,…

MySQL-运维篇

运维篇 日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&am…

Prompt Tuning(提示调优)到底训练优化的什么部位

Prompt Tuning(提示调优)到底训练优化的什么部位 在自然语言处理(NLP)领域,Prompt Tuning(提示调优)是一种轻量级的模型优化技术,其核心目标是通过优化提示(Prompt)来引导预训练语言模型(如GPT、BERT等)更好地完成特定任务,而无需大规模调整模型的主体参数。 一…

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。

基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升&#xff0c;对水资源管理和水位监测的需求…

OD 算法题 B卷【水果摊小买卖】

文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱&#xff0c;想做点水果买卖&#xff0c;给出两个数组m, n&#xff0c; m[i]表示第i个水果的成本价&#xff0c;n[i]表示第i个水果能卖出的价格&#xff1b;假如现在有本钱k&#xff0c;试问最后最多能赚多少钱&#xff1…

(新手友好)MySQL学习笔记(6):分组查询,正则表达式

目录 分组查询 创建分组 过滤分组 分组查询练习 正则表达式 匹配单个实例 匹配多个实例 正则表达式练习 练习答案 分组查询练习答案 正则表达式练习答案 分组查询 创建分组 group by 子句&#xff1a;根据一个或多个字段对结果集进行分组&#xff0c;在分组的字段上…

Android 之 kotlin 语言学习笔记四(Android KTX)

一、Android KTX 简介 Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此&#xff0c;这些扩展程序利用了多种 Kotlin 语言功能&#xff0c;其中包括&…

云原生思维重塑数字化基座:从理念到实践的深度剖析

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生为何成为数字化的“基础设施语言”&#xff1f; 随着5G、人工智能、物联网等技术逐步进入规模化落地阶段&am…

【C/C++】STL实现版本为什么比手写版本高?

文章目录 为什么标准库版本效率更高&#xff1f;1 具体介绍1.1 **内联优化&#xff08;Inlining&#xff09;和模板展开**1.2 **分支预测友好&#xff08;Branch Prediction&#xff09;**1.3 **迭代器解耦 静态分发**1.4 **代码紧凑&#xff0c;编译器优化空间大**1.5 **高质…

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题

江科大学长又发布了第二期的编写技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面给了一个未完成的任务&#xff1a; 这里我已经把这个问题给解决了&#xff01; 总代码放在资源里面&#xff0c;key.c放在文章最后面&#xff01;同时感…

STM32什么是寄存器

提示&#xff1a;文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空间中&#xff0c;512MB的block2上&#xff0c;每4个字节组成32位&#xff0c;这个32位为一个单元&#xff0c;控制&a…

【Pinia】Pinia和Vuex对比

Pinia 是 Vue 官方团队成员专门开发的一个全新状态管理库&#xff0c;并且 Vue 的官方状态管理库已经更改为了 Pinia。 在 Vuex 官方仓库中也介绍说可以把 Pinia 当成是不同名称的 Vuex 5&#xff0c;这也意味不会再出 5 版本了。 优点 1. 更加轻量级&#xff0c;压缩后提交只…

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…

Oracle双平面适用场景讨论会议

4月28日&#xff0c;我在杭州组织召开了Oracle双平面会议讨论沙龙。在国产化数据库浪潮的今天&#xff0c;Oracle数据库作为国产数据库的应急库&#xff0c;在国产数据库发生故障或者性能下降时&#xff0c;如何更好的使用Oracle。会议主题如下&#xff1a; 1、背景与痛点速览&…

10.Linux进程信号

1. 理解信号 信号VS信号量 老婆&#xff1a;老婆饼-》没有任何关系&#xff01;信号&#xff1a;闹钟&#xff0c;上课铃声&#xff0c;脸色...人-》进程&#xff1b;信号中断人正在做的事&#xff0c;是一种事件的异步通知机制&#xff1b; 我们自习一会&#xff0c;等张三回…