当前位置: 首页 > news >正文

数据结构入门-图的基本概念与存储结构

前言

        图和树都是图论的内容,树是特殊的图。数据结构中的图论部分和离散数学有大量重叠,代码内容占少数,定义占多数,平时多看两眼可以帮助记忆。

图的定义

图是由顶点(vertex)的有穷非空集合和顶点之间的边(eage)的集合组成的。

通常记为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是边的集合。

V(G)和E(G)通常分别表示图G的顶点和边集合。

注意:对于图这种数据结构,不允许没有顶点,但边集可以为空。

 无向图与有向图

V(G)={0,1,2,3}

E(G)={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)}

无向图边集用圆括号表示

V(G)={0,1,2}

E(G)={<0,1>,<1,2>,<1,0>}

有向图边集用尖括号表示 

边也称为弧,有向图的弧由弧尾指向弧头。

 简单图与多重图

限制一:图中不能有从顶点到其自身的边。

限制二:同一条边再图中不能出现两次或者两次以上。

不满足以上两条限制的图称为多重图。

 在数据结构的学习中,如果没有特殊提及,我们所学习的所有图都是指简单图。

完全图

 完全图:具有最多边数的图称为完全图。

对于一个具有n个顶点的无向完全图,边数量的最大值尾n(n-1)/2

对于一个具有n个顶点的有向完全图,边数量的最大值为n(n-1)

 

 路径和路径长度

路径:从一个顶点开始,经过一系列的边到达另外一个顶点形成的顶点序列。

路径长度:路径上边的条数。

回路(环):起点和终点相同,路径{0,3,1,0}是一个回路(环)。

 

 简单路径

简单路径:如果路径中不出现相同的顶点,则称为简单路径。

简单回路:除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。

 顶点的度

度:对于无向图,顶点的度指的是与顶点相关联边的数目。

入度:在有向图中,对于顶点v,箭头指向v的边的数目。

出度:在有向图中,对于顶点v,从该顶点出发的边的数目。

 

 度与边的关系

在无向图中,假设具有n个顶点,e条边

图中所有顶点度之和等于边数的两倍

对于有向图,所有顶点的出度之和与入度之和相等,弧的数量也相等。

子图

图G的子图H,H满足V(H)是V(G)子集且E(H)是E(G)子集。

 

 连通图

连通:在无向图中,如果从顶点v到顶点w有路径,则称顶点v到顶点w是连通的。

如果对于图中任意两个顶点都是连通的,则称此图为连通图。

 连通分量

无向图中的极大连通子图称为连通分量

连通分量为子图

子图为连通图

连通子图含有极大顶点数

具有极大顶点数的连通子图包含依附于这些顶点的所有边。

 

强连通图

强连通图:在有向图中,对于每一对顶点v和w,从v到w和从w到v都有路径,则称该有向图为强连通图。

有向图中顶点极大强连通子图称为有向图的强连通分量。

 

 生成树

生成树:指含有图中全部顶点的极小连通子树。

注意:包含所有顶点n,但只有足以构成一棵树的n-1条边。

 边的权和网

在一个图中,每条边可以标注上一个代表某种含义的数值,该数值称为这个边的权值网;边上带有权值的图,也称为带权图。

 图的存储结构

 邻接矩阵-无向

 将上面的图以两个数组的形式存储起来:

 

 在两个顶点之间,如果有连线,就用1表示,无连线就用0表示。

无向图的邻接矩阵具有按对角线对称的性质。

邻接矩阵-有向

 

 

 

 邻接矩阵-带权值

 

在带权图的边数组中,用∞符号来表示两个边之间没有关系,用权值来表示该边的权。 

邻接表-无向

 

 

 邻接表中用链表来表示每个顶点的关系,用数组下标来标记顶点,头节点是该顶点,链表节点中存储的数字是与该顶点相连的顶点下标。

邻接表-有向

 

 在这个邻接表中节点存储的都是出边的对应顶点,逆邻接表则存储入边的对应顶点。

逆邻接表

 

 十字链表

 

 tailvex表示弧尾,headvex表示弧头,headlink指向该节点被弧头链接的顶点的节点,tailink指向被弧尾链接的顶点的节点。

 如上图第一个链表的首节点中,0和3就代表从顶点V0指向顶点V3的一条边。

 在上述链表中,用横向链接的节点表示出边关系,用纵向链接的节点表示入边关系,横纵交错,构成十字链表。

邻接多重表

 

 ivex和jvex是某一条便连接的两个顶点的下标

ilink指同连接顶点ivex的下一条边

jlink指同连接顶点jvex的下一条边

 

 

先给出四个顶点的节点和五条边的节点。

 

按照每个顶点的顺序依次连接节点 。这样就解决了无向图的邻接表过于冗杂的问题。

http://www.dtcms.com/a/262784.html

相关文章:

  • 如何在Vue3中正确使用ref和reactive?
  • 洛科威岩棉板打造宁静空间,为业主构筑建筑“静世界”
  • 数据结构与算法分析课设:一元多项式求值
  • 【MySQL】JDBC编程
  • DDL-8-小结
  • 前端开发面试题总结-原生小程序部分
  • LLaMA-Factory支持的Alpaca和ShareGPT格式
  • 插入排序的简单介绍
  • 【算法】动态规划 70: 爬楼梯
  • 函数在球内恒为零的证明
  • 杭州燕壹画室:美术艺考领域新崛起的黑马画室
  • Kotlin空安全与异常处理
  • Apache Seata < 2.3.0 raft反序列化漏洞
  • 使用Dirichlet分布进行随机初始化
  • Hily×亚矩云手机:社交元宇宙的“云端心跳加速器”
  • mysql mvcc
  • (4)pytest-fixture
  • Webpack原理剖析与实现
  • Hive SQL 实战:电商销售数据分析全流程案例
  • 【指针与结构体的使用详解】
  • nis打包(HM NIS EDIT脚本编辑器)
  • 多路转接 poll
  • UV包管理学习 - 解决Python包线上线下版本不一致的问题
  • C/C++ 使用rapidjson库 操作Json格式文件(创建、插入、解析、修改、删除)
  • 【AI时代速通QT】第四节:Windows下Qt Creator调试指南
  • 百胜软件获邀走进华为,AI实践经验分享精彩绽放
  • 设计模式之外观模式
  • Hadoop WordCount 程序实现与执行指南
  • MidJourney生成东汉末年项羽全身像提示词
  • 多线程环境下的线程安全资源与缓存池设计:ThreadSafeObject 与 CachePool 实例解析