【数据结构-图】

目录

  • 1 图
  • 2 图的定义和基本概念(在简单图范围内)
  • 3 图的类型定义
  • 4 图的存储结构
    • 4.1 邻接矩阵 表示法
    • 4.2 邻接表 表示法
    • 4.3 十字链表 表示法
    • 4.4 邻接多重表 表示法
  • 5 图的遍历
    • 5.1 深度优先搜索-DFS 及 广度优先遍历-BFS
  • 6 图的应用
    • 6.1 最小生成树
      • 6.1.1 克鲁斯卡尔 (Kruskal) 算法
      • 6.1.2 普里姆 (Prim) 算法算法
    • 6.2 最短路径
      • 6.2.1 单源点最短路径(Dijkstra算法)
      • 6.2.2 单源点最短路径(弗洛伊德算法)
    • 6.3 拓扑排序
    • 6.4 AOE--网

学习记录,优先理解原理

1 图

  图是一种比线性表和树更复杂的数据结构,在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在 树形结构中,数据元素之间有着明显的层次关系,并且每一层中的数据元素可能和下一层中的多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关; 而在图结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。数据结构中,则应用图论的知识讨论如何在计算机上实现图的操作,因此主要学习图的存储结构,以及若于图的操作的实现。

2 图的定义和基本概念(在简单图范围内)

  图(Graph)是一种数学结构,用于表示对象之间的关系。在图中,通常包含以下元素:一些简单的概念术语就不讨论了,例如:
提醒一点下图是一个图还是4个图?(一个图,千万别说成四个图)

  • (x,y)指由x点到y点,且无方向;也就是(x,y)=(y,x);
  • <x,y>指由x到y,但是有方向;也就是<x,y>!=<y,x>;
  • 什么是顶点?
  • 什么是边?
  • 什么是图?
  • 什么是子图? —就是从一个图中拿走一部分,这部分就是子图,隶属关系
  • 什么是有向图?—只要有一根线带方向就是有向图
  • 什么是完全有向图?—就是图的所有线都有方向(n个顶点就是有${n(n-1)}$条线都有方向)
  • 什么是无向图?—就是没有一根线带方向
  • 什么是完全无向图?—就是图的所有线都没有方向(n个顶点就是有${n(n-1)/2}$条线都无方向)
  • 所以思考一个问题:a,b两个点,如果是无向图,最多是1条线,如果有向图是两条线:很重要:如下图,所以n个顶点,有向图最多n(n-1)条线,无向图最多是有向的一半;
  • 什么是权?—就是一条线的价值(数值)
  • 什么是邻接点?—无向图中挨着的点就是邻接点;
    但是注意在有向图中:如果 A 指向 B,但 B 不指向 A,那么 B 的邻接点是 A,A的邻接点不是B
  • 什么是度?—针对无向图,就是一根节点被插了几条线,注意无向图没有方向;出==入
  • 什么是入度?出度?—针对有向图,就是一个点射出几条线为出度,插入几条线就是入度;

  以上就是一些基本的简单的概念,稍微理解一下就行,下面的就有一些抽象,可以讨论一下

  1. 回路或者环;如下图画出来的就是环,第一个顶点和最后一个顶点相同的路径称为回路或环
  1. 连通、连通分量、连通图;这些针对无向图,首先是连通,连通的意思就是两个节点之间有线,如下图,V1到V2,V1到V5 都叫连通,画线都叫连通:

      知道了连通的意思,那么连通图的意思就是很好理解了,连通图顾名思义任意两个顶点都能连通。

  现在再问一下,下面的是一个图还是三个图,是连通图吗?----一个图----不是连通图

  很多人第一印象就是觉得是三个图,其实不然,图是一个集合,所以是一个图,这些集合中的元素如何区分呢?我们利用连通分量的的概念就能进行区分,连通分量指的是无向图中的极大连通子图,上图中刚好有三个连通分量(每个连通分量都是一个极大连通子图);如下:

  这样就能分成三个好研究的子图;即-连通分量指的是无向图中的极大连通子图

  1. 我们上面谈完无向图中叫连通、连通图、连通分量,那么在有向图中怎么叫呢?我觉得叫有向连通,比较通俗易懂,但是学术名称是强连通图和强连通分量:在有向图 G 中,如果对千每一对Vi,Vj属于 V;从 Vj到Vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称作有向图的强连通分量。例如下图,不是强连通图,但它有两个强连通分量,如图:
  1. 剩下两个概念就是连通图的生成树和有向树和生成森林:
    在这里插入图片描述

3 图的类型定义

  图是一种数据结构,加上一组基本操作,就构成了抽象数据类型。抽象数据类型图的定义如下;还记得之前对于复数的抽象数据类型的定义吗:如下:三部分-数据对象,数据关系,基本操作;

依次类比关于图的抽象数据结构如下:

  基本操作还有很多,这个可以根据自己的需求进行一些基本操作的编写;

4 图的存储结构

  由千图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序存储结构,但可以借助二维数组来表示元素之间的关系,即邻接矩阵表示法。另一方面,由千图的任意两个顶点间都可能存在关系,因此,用链式存储表示图是很自然的事,图的链式存储有多种,有邻接表、十字链表和邻接多重表,应根据实际需要的不同选择不同的存储结构。

4.1 邻接矩阵 表示法

  邻接表示法如下图所示:

  除了一个用千存储邻接矩阵的二维数组外, 还需要用一个一维数组来存储顶点信息。 创建一个采用邻接矩阵表示法创建无向网:

  这样的存储方式有缺点也有优点,缺点就是矩阵的通病,对于稀疏的图,这样会造成大量的空间浪费;

4.2 邻接表 表示法

  表头是一个数组结构体指针,每个结构体指针指向一个链表,有如下图:
  在邻接表中,对图中每个顶点V; 建立一个单链表,把与 V相邻接的顶点放在这个链表中,邻接表中每个单链表的第一个结点存放有关顶。

  值得注意的是,一个图的邻接矩阵表示是唯一的,但其邻接表表示不唯一,这是因为邻接表表示中,各边表结点的链接次序取决于建立邻接表的算法,以及边的输入次序。

4.3 十字链表 表示法

  十字链表(Orthogonal List)是有向图的另一种链式存储结构,可以看成将有向图的正邻接表和逆邻接表结合起来得到的一种链表。在十字链接结构中,对应于每个顶点有一个结点,对应于有向图中每一条弧也有一个结点,每条弧的弧头结点和弧尾结点都存放在链表中。

  十字链表是为了便于求得图中顶点的度(出度和入度)而提出来的,它是综合邻接表和逆邻接表形式的一种链式存储结构。在十字链表存储结构中,有向图中的顶点的结构如下所示:

  • data:表示顶点的具体数据信息。
  • firstIn:指向以该顶点为弧头的第一个弧节点。
  • firstOut:指向以该顶点为弧尾的第一个弧节点。
      为了表示有向图中所有的顶点,采用一个顶点数组存储每一个结点。弧节点是十字链表存储结构中用于表示有向图中每一条弧的节点。它的结构包含以下几个域:
  • tailVex:表示该弧的弧尾顶点在顶点数组中的位置。
  • headVex:表示该弧的弧头顶点在顶点数组中的位置。
  • nextArc:指向弧头相同的下一条弧。
  • prevArc:指向弧尾相同的下一条弧。
  • info:该弧的信息。
      弧节点通过tailVexheadVex字段与顶点节点相连,形成了有向图的存储结构。通过弧节点的链接关系,可以方便地访问有向图中的弧信息,以及进行与弧相关的操作,如遍历弧、查找弧等。

4.4 邻接多重表 表示法

 待补充、、、、、

5 图的遍历

  和树的遍历类似,图的遍历也是从图的某一项点开始,按照某种方法对图中所有顶点访问且仅访问一次。图的遍历算法是求解图的连通性问题,拓扑排序和关键路径等算法的基础。

5.1 深度优先搜索-DFS 及 广度优先遍历-BFS

  理解这个之前,先理解一下树中的DFS和BFS遍历,其实树中的DFS就是后序遍历,BFS就是层次遍历,如下图:

  现在放到图中,依然是这样,对于图而言,DFS就是一直找到头,到头后开始访问,就类似于树中的后序访问(其中最重要的是回溯的思想),而BFS就是广度优先遍历,要用到队列,核心就是一层一层的进行遍历:如下图:和深度优先搜索类似,广度优先搜索在遍历的过程中也需要一个访问标志数组。回退时判断有没有访问过这个节点

6 图的应用

6.1 最小生成树

  先明白一个问题就是,最小生成树是一颗树,树的各个点都是连通的,N个节点的树有n-1根线,拿无向图而言,而对于一个图而言,其可能是由很多连通图组成的一个大图,但是要组成一棵树,就不能有环的存在,而且整个图是连通的,且其线是n-1条,这样才能生成一颗树,其中每条线对应一个数值,把这些数值相加得到一个整体的值这个值如果最小,那么就是得到了最小的生成树;采用贪婪算法,主要的算法有:克鲁斯卡尔 (Kruskal) 算法和普里姆 (Prim) 算法。

6.1.1 克鲁斯卡尔 (Kruskal) 算法

  这个算法的步骤就是,先把所有的边存储起来,然后把边从小到大进行排序,然后依次把边从小到大放回原图,也称为加边法,并每次进行判断有没有环的生成,如果又环的生成,就放弃这条线,再向下面取线,直到取到n-1条线,就生成了最小生成树。
与普里姆算法相比,克鲁斯卡尔算法更适合千求稀疏网的最小生成树

6.1.2 普里姆 (Prim) 算法算法

  这个算法有点抽象,核心就是找两个集合之间的最短路径,其中一个集合就是已找到的节点,另外一个集合就是未找到的节点集合,找出中间最短的路径,并纳入一个新的节点,也称 加点法,核心原理就是这样,不用判断有没有环:注意:每次选择最小边时, 可能存在多条同样权值的边可选, 此时任选其一即可。
普里姆算法的时间复杂度为 O(n^2), 与网中的边数无关, 因此适用千求稠密网的最小生成树。

6.2 最短路径

  假设一个人不考虑费用和时间,从A到B,要求中转次数最少,那么这就是一个简单图的问题,简化一下,就是求A到B的最短路径,可以采用图的层次遍历也就是BFS算法(广度优先搜索),直到遇到顶点B就停止,其中中转次数就是A到B之间的节点数;
  显然问题还可以进一步的深入,对于旅客而言,他们关心的就是A到B的费用最少,而对于司机而言,他们更关心的是里程和速度,因此要对图中进行一些改变:为了在图上表示有关信息,可对边赋以权,权的值表示两城市间的距离,或途中所需时间,或交通费用等。此时路径长度的度最就不再是路径上边的数目,而是路径上边的权值之和。考虑到交通图的有向性,例如,汽车的上山和下山,轮船的顺水和逆水,所花费的时间或代价就不相同,所以交通网往往是用带权有向网表示。在带权有向网中,习惯上称路径上的第一个顶点为源点(Source), 最后一个顶点为终点(Destination);

6.2.1 单源点最短路径(Dijkstra算法)

  本节将讨论单源点的最短路径问题:给定带权有向图G和源点Vo , 求从Vo到G中其余各顶点的最短路径。迪杰斯特拉(Dijkstra)提出了一个按路径长度递增的次序产生最短路径的算法,
称为迪杰斯特拉算法。
  注意最小生成树不等于Dijkstra算法:两个解决的问题不一样, 一个是求最短的路线, 一个是解决怎么花最小的成本连通所有点不过Dijkstra算法和最小生成树里的Prim算法思路还挺像的, 但要注意Dijkstra算法每次找的是距离源点(比如我视频里的a点)最近的点, 但是Prim算法每次找的是距离正在生成的树最近的点. 有的点可能距离正在生成的树是最近的但是距离源点不是最近的, 所以Dijkstra算法不等于Prim算法, 也不能用来求最小生成树。

6.2.2 单源点最短路径(弗洛伊德算法)

  待补充

6.3 拓扑排序

  一个无环的有向图称作有向无环图( DirectedAcycline Graph), 简称DAG图。有向无环图是描述一项工程或系统的进行过程的有效工具。通常把计划、 施工过程、 生产流程、 程序流程等都当成一个工程。除了很小的工程外,一般的工程都可分为若干个称做活动(Activity)的子工程,而这些子工程之间, 通常受着一定条件的约束, 如其中某些子工程的开始必须在另一些子工程完成之后。

待补充–

6.4 AOE–网

  与AOV-网相对应的是AOE-网 (Activity On Edge) , 即以边表示活动的网。 AOE-网是一个带权的有向无环图, 其中, 顶点表示事件, 弧表示活动, 权表示活动持续的时间。 通常, AOE-网可用来估算工程的完成时间。

待补充–

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

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

相关文章

vue cli3开发自己的插件发布到npm

具体流程如下&#xff1a; 1、创建一个vue项目 vue create project 2、编写组件 &#xff08;1&#xff09;新建一个plugins文件夹&#xff08;可自行创建&#xff09; &#xff08;2&#xff09;新建Button组件 &#xff08;3&#xff09;组件挂载&#xff0c;为组件提供 in…

Python绘制3D曲面图

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Python中绘制3D曲面图的艺术 在数据可视化的世界中&#xff0c;3D曲面图是一种强大的工…

数据链路层(计算机网络,待完善)

0、前言 本文大多数图片都来自于 B站UP主&#xff1a;湖科大教书匠 的教学视频&#xff0c;对高军老师及其团队制作出这么优质的课程表示感谢。文章增加了部分个人理解&#xff0c;内容并不是对视频的静态化翻译。 1、概述 1.1、数据链路层在计算机网络体系中的位置 1.2、对…

Jenkins集成Terraform实现阿里云CDN自动刷新

在互联网业务中&#xff0c;CDN的应用已经成了普遍&#xff0c;SRE的日常需求中&#xff0c;CDN的刷新在前端需求逐渐中占了很大比例&#xff0c;并且比较琐碎。做为合格的SRE&#xff0c;把一切自动化是终极使命&#xff0c;而今天就分享通过JenkinsTerraform实现阿里云的CDN自…

CISSP通关学习笔记:共计 9 个章节(已完结)

1. 笔记说明 第 0 章节为开篇介绍&#xff0c;不包括知识点。第 1 - 8 章节为知识点梳理汇总&#xff0c;8 个章节的知识框架关系如下图所示&#xff1a; 2. 笔记目录 「 CISSP学习笔记 」0.开篇「 CISSP学习笔记 」1.安全与风险管理「 CISSP学习笔记 」2.资产安全「 CISSP…

机器学习/算法工程师面试题目与答案-深度学习部分1

机器学习/算法工程师面试题目与答案-深度学习部分 BatchNormalization的作用梯度消失循环神经网络&#xff0c;为什么好?什么是GroupConvolution什么是RNN神经网络中权重共享的是&#xff1f;神经网络激活函数&#xff1f;为什么在深度学习中常进行finetuning画GRU结构图什么是…

Flink CDC详解

文章目录 Flink CDC一 CDC简介1.1 CDC定义1.2 CDC应用场景1.3 CDC实现机制1.4 开源CDC工具对比 二 Flink CDC简介2.1 Flink CDC介绍2.2 Flink CDC Connector(连接器)2.3 Flink CDC && Flink版本2.4 Flink CDC特点 三 Flink CDC发展3.1 发展历程3.2 背景Dynamic Table &…

51单片机入门_江协科技_35~36_OB记录的自学笔记_AD与DA转换(XPT2046)

35. AD_DA 35.1. AD/DA介绍 •AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号 •DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换…

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E&#xff08;端到端&#xff09;测试是一种软件测试方法&#xff0c;旨在模拟真实的用户场景&#xff0c;测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

信息系统项目管理师论文考察范围预测

在2023年下半年实施机考之前&#xff0c;论文的范围还是比较好预测的&#xff0c;因为从历年考题来看&#xff0c;可以说十大管理领域考察的概率接近100%&#xff0c;而且有一定规律&#xff0c;比如说某个管理领域很久没考了&#xff0c;那么考察的概率就相对大一点&#xff0…

IDEA 全局查找 ctrl + shift + F 快捷键失效

全局查找&#xff1a;ctrl shift F 需要关闭微软输入法简体/繁体切换&#xff0c;不然被占用了无效 (装了搜狗输入法的同理,找一下是不是这个快捷键冲突了 ) 另外还有 IDEA 中 重构变量名 &#xff1a;shift F6 需要关闭微软输入法最新版本 ( 使用以前版本的微软输入法就没…

CSS渐变色理论与分类、文字渐变色方案、炸裂渐变色方案以及主流专业渐变色工具网站推荐

渐变色彩可以增加视觉层次感和动态效果&#xff0c;使网页界面更加生动有趣&#xff0c;吸引用户注意力。另外&#xff0c;相较于静态背景图片&#xff0c;CSS渐变无需额外的HTTP请求&#xff0c;减轻服务器负载&#xff0c;加快页面加载速度&#xff1b;同时CSS渐变能够根据容…

windows下git提交修改文件名大小写提交无效问题

windows系统不区分大小写&#xff0c;以及git提交忽略大小写&#xff0c;git仓库已存在文件A.js&#xff0c;本地修改a.js一般是没有提交记录的&#xff0c;需要手动copy一份出来A.js&#xff0c;再删除A.js文件提交仓库删除后&#xff0c;再提交修改后的a.js文件。 windows决…

C/C++程序设计实验报告4 | 函数实验

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告&#xff0c;适合C语言初学者们学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是C语言&#xff0c;C的元素最多可能只…

SV-7041T IP网络有源音箱 教室广播多媒体音箱(带本地扩音功能)教学广播音箱 办公室背景音乐广播音箱 2.0声道壁挂式网络有源音箱

SV-7041T IP网络有源音箱 教室广播多媒体音箱&#xff08;带本地扩音功能&#xff09; 教学广播音箱 办公室背景音乐广播音箱 一、描述 SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带…

tailwindcss在使用cdn引入静态html的时候,vscode默认不会提示问题

1.首先确保vscode下载tailwind插件&#xff1a;Tailwind CSS IntelliSense 2.需要在根目录文件夹创建一个tailwind.config.js文件 export default {theme: {extend: {// 可根据需要自行配置&#xff0c;空配置项可以正常使用},}, }3.在html文件的标签中引入配置文件&#xf…

【JavaScript】axios

基础使用 <script src"https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.min.js"></script> <script>axios.get(https://study.duyiedu.com/api/herolist).then(res> {console.log(res.data)}) </script>get - params <script s…

数据仓库与数据挖掘(实验一2024.4.24)

实验准备&#xff1a; 1.下载conda 2.配置环境C:\ProgramData\miniconda3\Scripts 3.创建文件夹panda进入虚拟环境qq 激活虚拟环境&#xff1a;activate qq 启动jupyter lab&#xff08;python语言环境编译&#xff09;&#xff1a;jupyter lab 4.panda下载 &#xff08;…

HTB Runner

Runner User Nmap ──(root㉿kali)-[/home/…/machine/SeasonV/linux/Runner] └─# nmap -A runner.htb -T 4 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-22 23:07 EDT Stats: 0:00:01 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Sca…

用户中心 -- 代码理解

一、删除表 & if 删除表 1.1 DROP TABLE IF EXISTS user 和 DROP TABLE user 网址&#xff1a; 用户管理第2节课 -- idea 2023.2 创建表--【本人】-CSDN博客 二、 代码 2.1 清空表中数据 的 命令 【truncate 清空】 网址&#xff1a; 用户管理第2节课 -- idea 2…