数据结构学习记录——什么是图(抽象数据类型定义、常见术语、邻接矩阵表示法、邻接表表示法)

news2024/11/28 0:38:40

目录

什么是图

抽象数据类型定义

常见术语

无向图

有向图

网络

邻接点

度(出度、入度)

稀疏图

稠密图、完全图

边密度

邻接矩阵表示法

用二维数组存储

用一维数组存储

邻接矩阵的好处 

邻接矩阵的坏处 

邻接表表示法

指针数组-链表存储 

邻接表的特点 


什么是图

表示“多对多”的关系

包含

 

抽象数据类型定义

类型名称:图(Graph)

数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成。

操作集:对于任意图G属于Graph,以及v属于V,e属于E

  • Graph Create();建立并返回空图
  • Graph InsertVertex(Graph G,Vertex v);将v插入G
  • Graph InsertEdge(Graph G,Edge e);将e插入G
  • void DFS(Graph G,Vertex v);从顶点v出发深度优先遍历图G
  • void BFS(Graph G,Vertex v);从顶点v出发宽度优先遍历图G
  • void ShortestPath(Graph G,Vertex v,int Dist[]);计算图G中顶点v到任意其他顶点的最短距离;
  • void MST(Graph G);计算图G的最小生成树
  • ......

常见术语

无向图

无向图是由一组节点和连接这些节点的边组成的图形结构,其中边没有方向。

有向图

有向图是由节点和有方向的边组成的图形结构。每条边都有一个指定的方向,从一个节点指向另一个节点。这意味着在有向图中,边表示了节点之间的单向关系。

网络

网络是由节点和边组成的图形结构,其中边具有权值或称为权重。

这些权值可以表示节点之间的距离、成本、容量或其他度量。

邻接点

在图中,邻接点是指与给定节点直接相连的节点。对于无向图,如果两个节点之间有一条边,则它们互为邻接点。对于有向图,只有当一条边从节点 A 指向节点 B 时,节点 B 才是节点 A 的邻接点。

度(出度、入度)

在有向图中,度是指一个节点的边的数量。

而出度是从节点出发的边的数量,表示离开该节点的连接数;

入度是指指向节点的边的数量,表示指向该节点的连接数。

稀疏图

稀疏图是指边相对较少的图。

或者说,稀疏图中节点之间的连接较少或边的数量相对较小。

稀疏图通常具有较低的边密度,节点之间的连接相对稀疏。

稠密图、完全图

稠密图是指边相对较多的图。

稠密图中节点之间的连接较多或边的数量相对较大。

稠密图具有较高的边密度,几乎每个节点都与其他节点相连。完全图是一种特殊的稠密图,其中每两个节点之间都存在一条边,也就是说,每个节点都与图中的其他节点直接相连。

边密度

对于无向图,可能的边数是 n(n-1)/2;

对于有向图,可能的边数是 n(n-1),其中 n 是节点数。

我们可以使用以下公式计算图的边密度:

d = m / (n(n-1)/2)

其中 m 是图中的边数,n 是节点数。

如果边密度接近 0,则该图被认为是稀疏图;如果边密度接近 1,则该图被认为是稠密图。

邻接矩阵表示法

用二维数组存储

邻接矩阵G[N] [N]——N个顶点从0到N-1编号

现在试着把下面这个图用邻接矩阵表示法表示出来 

 

 得到:

邻接矩阵的表达方式是比较简洁的,很直观地展示了节点之间的关系;

而且对于无向图来说,邻接矩阵是对称的。 

 

用一维数组存储

对于无向图的存储,怎样可以省一半的空间?

我们利用它的对称性,就可以用一个长度为N(N+1)/2的一维数组A存储。

举个例子,假设有一个无向图,有四个节点 A、B、C、D,邻接矩阵如下:

 

如果我们只存储对角线以上的元素,那么邻接矩阵可以表示为: 

数组A为:

 

邻接矩阵的好处 

  • 直观、简单、好理解
  • 方便检查任意一对顶点间是否存在边
  • 方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
  • 方便计算任一顶点的“度”

 

邻接矩阵的坏处 

  • 浪费空间——存稀疏图有大量无效元素

对稠密图(特别是完全图)还是十分合算的

  • 浪费时间——统计稀疏图中一共有多少条边

对于稀疏图而言,边的数量相对较少,很多节点之间并没有直接的连接。

因此,遍历整个邻接矩阵或邻接列表来计算边的数量将涉及大量的无效操作,导致时间和计算资源的浪费。

邻接表表示法

指针数组-链表存储 

邻接表:G[N]为之指针数组,对应矩阵每行一个链表,只存非0元素

用邻接表表示法表示之前一样的图

对于网络,结构中要增加权重的域。 

邻接表的特点 

  • 方便找任一顶点的所有“邻接点”
  • 节约稀疏图的空间

需要N个头指针+2E个结点(每个结点至少2个域)

  • 对于无向图来说,方便计算任一顶点的“度”

而对于有向图,只能计算“出度”;需要构造“逆邻接表”(存指向自己的边)来方便计算“入度”

  • 方便检查任意一对顶点间是否存在边

end


学习自:MOOC数据结构——陈越、何钦铭

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

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

相关文章

ES的可视化工具-Kibana的安装和使用

【前言】 Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。 下面是Kibana的安装步骤,控…

Vue项目的搭建和启动

文章目录 一、安装配置 node.js1.1 下载安装1.2 配置环境变量1.3 修改模块下载位置1.4 设置淘宝镜像 二、创建启动 Vue三、开发环境 VSCode3.1 开发插件3.2 Vue 项目结构 提示:以下是本篇文章正文内容,前端系列学习将会持续更新 一、安装配置 node.js …

【重新定义matlab强大系列六】利用matlab进行一维滤波or二维滤波

🔗 运行环境:matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

NVM —— 你把我玩明白

前期回顾 纯前端 根据目录解析word,拆分不同段落_彩色之外的博客-CSDN博客纯前端 解析 wordhttps://blog.csdn.net/m0_57904695/article/details/130503211?spm1001.2014.3001.5501 👍 本文专栏:开发技巧 目录 🍺 下载 及 配置镜像 …

如何设计测试用例以及常用的黑盒测试方法

目录 如何设计测试用例? 设计测试用例的万能公式 ①功能测试 (用户的基本功能需求) ②性能测试 ③易用性(考虑用户体验)测试 ④兼容性测试 ⑤界面(UI,外观)测试 ⑥安全测试 常用黑盒测试方法 …

MySQL_4 常见函数汇总及演示

目录 一、统计函数 1.基本语法 : 2.代码演示 : 演示Ⅰ—— 演示Ⅱ—— 二、合计函数 1.基本语法 : 2.代码演示 : 三、平均函数 1.基本语法 : 2.代码演示 : 四、最值函数 1.基本语法 : 2.代码演示 : 五、字符串函数 1.常用字符串函数 : 2.代码演示 : 六、数学…

Linux基础学习---6、系统定时任务、软件包管理、虚拟机克隆

1、系统定时任务 1.1 crontab 服务管理 1、重新启动crond服务1.2 crontab 定时任务设置 1、基本语法crontab [选项] 2、选项说明选项功能-e编辑crontab定时任务-l查询crontab任务-r删除当前用户所有的crontab任务 3、参数说明 (1)进入crontab编辑页面…

SpringSecurity 快速入门

1. 认证授权概述 1.1 认证授权概念 1.1.1 认证 在互联网中,我们每天都会使用到各种各样的APP和网站,在使用过程中通常还会遇到需要注册登录的情况,输入你的用户名和密码才能正常使用,也就是说成为这个应用的合法身份才可以访问…

项目开发工具【EditorConfig,Prettier,ESLint,Git Husky,Commitizen,Commitlint】

项目开发工具【六款】 前言 六款插件让你项目更加的规范✨✨✨ EditorConfig:为不同编辑器上处理同一项目的多个开发人员维护一致的编码风格Prettier:一款强大的代码格式化工具,是当下前端最流行的代码格式化工具ESLint:查找潜在…

图像增强库albumentations(v1.3.0, 2023.5)中所有图像增强方法记录(class)

整体概要 变换类型具体类模糊/噪声AdvancedBlur*,Blur*,Downscale*,Defocus*,GlassBlur*,GaussianBlur*,GaussNoise*,ImageCompression*,ISONoise*,MultiplicativeNoise…

MySQL基础-SQL介绍

本文介绍MySQL中SQL通用语法,包括:DDL,DML,DQL,DCL 文章目录 SQL分类DDL(数据定义语言)数据库操作表操作 DML(数据操作语言)添加数据更新和删除数据 DQL基础查询条件查询…

Linux sed流编辑器

sed流编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed 的工作流程主要包括读取…

智能的本质人工智能与机器人领域的64个大问题阅读笔记(二)

目录 如果一个人不能理解所说语言的全部信息,那么说这种语言也是没有意义的。 “20年内,机器将能够胜任人类承担的所有工作”(赫伯特西蒙, 1965)。 以及21世纪的人类愿意相信超智能机器时代的到来,与前几…

项目中大批量数据查询导致OOM

项目中有时候一次性将大批量数据都查出来到内存中导致内存占用过多很可能会导致内存溢出 问题复现 搭建一个本地项目。需求描述:查询表call_task中待拨打的数据进行拨打,call_task中一次可能会有大批量数据需要处理。本次准备了1万条数据。 /*** 查询…

【Java校招面试】基础知识(九)——Redis

目录 前言一、基础概念二、Redis持久化三、Redis分布式存储后记 前言 本篇主要介绍Redis数据库的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第九篇博文,如有需要,可: 点击这里,返回本专栏的索引文章点…

(c语言实现)数据结构链表oj题(2)

前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:分析力扣中有关链表的部分题目. 目录 前言一、链表中倒…

HTML第二天

第二天 表格 表格的主要作用 1.表格主要用于显示、展示数据,因为它可以让数据显示的非常的规整,可读性非常好。特别是后台展示数据的时候,能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理2.表格不是用来…

Java基础知识:1,DOS命令

1,盘名称 加 : 进入该盘目录下 例如:e: 进入e盘 2,dir 查看当前路径下文件和文件夹 3,md 文件夹名字 》 创建文件夹(md后要加空格) (md make directory) 4,c…

Oracle11g下载与安装

一、Oracle11g下载 官网下载地址:Oracle Database 11g Release 2 for Microsoft Windows (x64) 选择"Accept License Agreement",点击"win64_11gR2_database_1of2.zip"和"win64_11gR2_database_2of2.zip",进行…

Debian11之 K3s 部署K8S集群

K3S 架构方案 Server 节点指的是运行 k3s server 命令的主机,control plane 和数据存储组件由 K3s 管理Agent 节点指的是运行 k3s agent 命令的主机,不具有任何数据存储或 control plane 组件Server 和 Agent 都运行 kubelet、容器运行时和 CNI 基于 …