【数据结构-图】

news2024/12/23 8:55:36

目录

  • 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.coloradmin.cn/o/1620196.html

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

相关文章

Azure AKS集群监控告警表达式配置

背景需求 Azure AKS集群中&#xff0c;需要对部署的服务进行监控和告警&#xff0c;需要创建并启用预警规则&#xff0c;而这里怎么去监控每个pod级别的CPU和内存&#xff0c;需要自己写搜索查询 解决方法 搜索和查询的语句如下&#xff0c;需要自己替换其中的部分信息,其中…

Qwen1.5微调

引子 由于工作上需要&#xff0c;一直在用Qwen做大模型推理&#xff0c;有个再训练的需求&#xff0c;特此琢磨下Qwen的训练。OK&#xff0c;我们开始吧。 一、安装环境 查看显卡驱动版本 根据官网推荐 OK&#xff0c;docker在手&#xff0c;天下我有。 docker pull qwenll…

vuetify3.0+tailwindcss+vite最新框架

1、根据vuetify官网下载项目 安装vuetify项目 2、根据tailwindcss官网添加依赖 添加tailwindcss依赖 3、 配置main.ts // main.ts import "./style.css"4、使用 <template><h1 class"text-3xl font-bold underline">Hello world!</…

sscanf和scanf区别

sscandf 从字符串中提取数据 scanf 标准输入流读取数据 int num; sscanf("42", "%d", &num);float f; sscanf("3.14", "%f", &f);char str[20]; sscanf("Hello, World!", "%s", str);int a, b; sscanf(…

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

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

路由过滤与引入实验

一.实验要求及拓扑 二.实验思路 1.配置IP地址及环回 2.配置OSPF协议及RIP协议 3.OSPF和RIP进行路由引入 4.在R2上配置路由过滤&#xff0c;使RIP部分无法学到R4业务网段的信息 5.在R4上进行路由过滤&#xff08;地址前缀列表&#xff09;&#xff0c;使 R4 无法学习到 R1…

centos7服务器系统如何安装宋体字文件

centos7服务器系统如何安装宋体字文件&#xff01; 最近开发的积德寺app,菩提佛堂祈福平台网站发布后&#xff0c;由于服务器之前遇到了攻击&#xff0c;数据丢失了&#xff0c;重新安装了一遍系统centos7.发现客户的功德证书创建后&#xff0c;字体乱码了。很明显是缺少了宋体…

Linux 内核调试环境搭建

目录 QEMU Linux 0.11 源码 ​编辑 gdb 调试 学习Linux内核&#xff0c;我们可以看书&#xff0c;实际我们最好可以有一个可以调试的环境&#xff0c;本文就简单介绍一下使用Qemu 和gdb 来调试和查看Linux kernel 。在ubantu 20.04 的PC 上面编译内核源码&#xff0c;通过QE…

基于springboot+vue+Mysql的CSGO赛事管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【点量云流】国内首家适配国产信创的实时云渲染解决方案,助力国产化信创新体验!

一、背景 随着信息技术的广泛应用&#xff0c;信息安全与自主可控成为国家发展的重要保障。近年来&#xff0c;国产化信创的发展&#xff0c;为推动信息技术产业自主创新&#xff0c;实现关键技术和产品的自主可控&#xff0c;对于保障国家信息安全、促进产业发展有着重要意义。…

Spectre-v2 以及 Linux Retpoline技术简介

文章目录 前言一、Executive Summary1.1 Spectre-v2: Branch Predictor Poisoning1.2 Mitigating Spectre-v2 with Retpolines1.3 Retpoline Concept 二、BackgroundExploit Composition 三、(Un-)Directing Speculative Execution四、Construction (x86)4.1 Speculation Barri…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

大模型-入门小知识

大模型是什么 大量参数&#xff08;上亿&#xff09;深度学习模型 人工只能包含机器学习&#xff0c;深度学习,深度学习包括大模型 单个神经元的计算模型&#xff1a; 大模型是怎么训练的 之前是算法&#xff08;神经网络&#xff09;----> 训练&#xff08;门槛降低&…

Win linux 下配置adb fastboot

一、Win配置adb & fastboot 环境变量 主机&#xff1a;Win10&#xff0c;除了adb fastboot需要设置变量之外&#xff0c;驱动直接安装即可 win下adb fastboot 下载地址&#xff1a;https://download.csdn.net/download/u012627628/89215420 win下qcom设备驱动下载地址&a…

C# winfrom窗体最小化任务栏托盘

一、添加notifyIcon控件 二、点击缩小按钮 三、添加notifyIcon双击还原事件 四、添加contextMenuStrip多任务菜单 五、将 contextMenuStrip绑定到notifyIcon控件 六、双击还原还原窗体 七、双击退出退出应用程序 一、添加notifyIcon控件 设置notifyIcon样式 Icon图标以…

k8s-pod 控制器

文章目录 k8s-pod 控制器无状态服务与有状态服务无状态服务pod 控制器ReplicationController(RC)ReplicaSet(RS)Label 和 Selector Deployment创建滚动更新回滚版本扩容/缩容暂停和恢复 StatefulSet创建扩容/缩容更新RollingUpdate->金丝雀发布OnDelete 删除 DaemonSet节点选…

2023中国便利店TOP100公示

转载来源&#xff1a;中国连锁经营协会

品牌差异化战略:Kompas.ai如何打造独特的内容声音

在当今竞争激烈的商业环境中&#xff0c;品牌差异化已成为企业获取市场优势的关键策略。一个鲜明的品牌形象和独特的内容声音不仅能够帮助企业吸引目标客户&#xff0c;还能够在消费者心中建立起独特的地位。本文将深入探讨品牌差异化的重要性&#xff0c;分析Kompas.ai如何帮助…

jsp实验11 JavaBean

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握javabean的用法。【参考课本 上机实验 5.5.2 】 三、源代码以及执行结果截图&#xff1a; 源代码&#xff1a; Memory.java package sea.water; import java.util.ArrayList; import java.util…

代码随想录算法训练营第四十二天|01背包问题,416. 分割等和子集

背包问题 背包问题一般有以下几类&#xff1a; 掌握01背包和完全背包即可。 先理解01背包。完全背包可以看作是01背包问题的变形。 01背包 什么是01背包问题&#xff1f; 有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[…