首页 > 编程语言 >【数据结构与算法】图的存储(邻接矩阵,邻接表)详解

【数据结构与算法】图的存储(邻接矩阵,邻接表)详解

时间:2024-06-23 13:00:08浏览次数:23  
标签:存储 邻接 GraphKind 邻接矩阵 详解 数组 顶点 数据结构 adj

图的邻接矩阵数据结构

typedef enum { NDG, DG, NDN, DN } GraphKind;

using VRType = int;
using InfoType = int;

typedef struct ArcCell {
	VRType adj;
	InfoType *info;
} Arc[N][N];

struct MGraph {
	ElemType vexs[N];
	Arc arc;
	int vexnum, arcnum;
	GraphKind kind;
};

ArcCell 结构体包含两个成员:

  • adj 是一个 VRType 类型的变量,表示顶点之间的关系,例如,如果两个顶点之间存在边,那么 adj 表示这条边的权重。
  • info 是一个指向 InfoType 类型的指针,用于存储与边相关的额外信息。

MGraph 结构体包含四个成员:

  • vexs 是一个 ElemType 类型的数组,用于存储图的顶点。
  • arc 是一个 Arc 类型的二维数组,用于存储图的边。
  • vexnum 是一个整数,表示图的顶点数量。
  • arcnum 是一个整数,表示图的边数量。
  • kind 是一个 GraphKind 类型的枚举,表示图的类型。

图的数组表示法、邻接表存贮结构各自的优缺点,适应的运算。

  1. 图的数组表示法(邻接矩阵):

    • 优点:容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。
    • 缺点:n个顶点需要n*n个单元存储边(弧);空间效率为 O ( n 2 ) O(n^2) O(n2)。 对稀疏图而言尤其浪费空间。
    • 适应的运算:边的数量较多,需要频繁检查节点间是否存在边的场景。
  2. 图的邻接表存储结构:

    • 优点:n个顶点、e条边的无向图,只需要n个头结点和2e个表结点。对稀疏图而言,比数组表示法节省存储空间。
    • 缺点:每条边需要对应两个表结点。
    • 适应的运算:边的数量较少,需要频繁添加或删除边的场景。

标签:存储,邻接,GraphKind,邻接矩阵,详解,数组,顶点,数据结构,adj
From: https://blog.csdn.net/qq_34988204/article/details/139782423

相关文章

  • Transformer细节(六)——详解Transformer各层结构和组成
    Transformer模型的架构是由多个编码器(Encoder)和解码器(Decoder)层堆叠而成的。一、编码器(Encoder)        编码器由多个相同的编码器层(EncoderLayer)堆叠而成。每个编码器层包含两个主要子层:自注意力(Self-Attention)子层和前馈神经网络(FeedForwardNeuralNetwork,FFN)子......
  • 学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详
            在C#中,委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性,它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作,以及如何在实际编程中有效利用它们。委托基础        委托是C#中的一种引用类型,它允许封装一......
  • Java数据类型详解
    Java作为一种静态类型语言,在编译时就需要确定变量的数据类型。Java的数据类型可以分为两大类:基本数据类型和引用数据类型。本文将详细介绍这些数据类型,并通过代码示例展示如何使用它们。一、基本数据类型Java中的基本数据类型包括四类八种:整数类型、浮点数类型、字符类型......
  • 数据结构历年考研真题对应知识点(栈和队列的应用)
    目录3.3栈和队列的应用3.3.2栈在表达式求值中的应用【中缀表达式转后缀表达式的过程(2012、2014)】【栈的深度分析(2009、2012)】【用栈实现表达式求值的分析(2018)】 3.3.3栈在递归中的应用【栈在函数调用中的作用和工作原理(2015、2017)】3.3.5队列在计算机系统中的......
  • Transformer细节(五)——详解Transformer解码器的自注意力层和编码器-解码器注意力层数
    一、自注意力层(Self-AttentionLayer)并行处理目标序列        自注意力层的任务是计算输入序列中每个位置之间的关系,并生成每个位置的表示。这一过程可以并行处理,因为它并不依赖于前一个位置的计算结果。自注意力机制的具体步骤1.输入嵌入与位置编码      ......
  • 【数据结构】【版本1.3】【线性时代】——栈
    快乐的流畅:个人主页个人专栏:《算法神殿》《数据结构世界》《进击的C++》远方有一堆篝火,在为久候之人燃烧!文章目录引言一、栈的概念二、栈的模拟实现2.1定义2.2初始化2.3销毁2.4压栈2.5判空2.6出栈2.7获取栈顶元素2.8获取栈的元素个数2.9元素......
  • Redis-数据结构-跳表详解
    Redis概述Redis-数据结构-跳表详解跳表(SkipList)是一种基于并联的链表结构,用于在有序元素序列中快速查找元素的数据结构。Redis中广泛使用跳表来实现有序集合(SortedSet)这一数据结构。1.跳表的基本概念和特点跳表的核心思想是通过在不同层级(level)上增加指针来加速查......
  • OSPF 3类LSA详解 / 区域间防环
    概述3类LSA的名称为NetworkSummaryLSA,Summary也就是总结的意思,注意3类LSA的背景,在多区域的场景下才有3类LSA(多区域的背景在OSPF区域文章中有详细说明),其中区域之间的设备被称为ABR,最主要的2个信息,LinkStateID:在3类LSA中为网段IPNetworkMask:......
  • C++ 结构体对齐详解
    目录前言一、为什么要对结构体进行对齐操作?二、基本概念三、对齐规则四、示例讲解1.简单的变量对齐2.结构体包含有结构体的对齐结构体成员详细解析五、使用指令改变对齐方式__attribute__((packed))#pragmapack(push,n)#pragmapack(pop)六、总结前......
  • ThreadLocal详解
    在做项目时发现项目中一般都会把用户信息存入ThreadLocal中,方便后续使用用户信息。但是ThreadLocal的原理是什么呢?这里结合网上的资料记录一下我自己的理解。ThreadLocal是什么?网上有的说法是ThreadLocal是线程本地变量,如果创建了一个ThreadLocal变量,那么访问这个变量的每......