14 图的基础知识-几种常用的存储结构

时间有点紧 没时间接着更了。。考完研回头再写吧



一、邻接矩阵
1、描述:用一维数组存储图顶点的信息
用二维数组存储图边的信息
2、特点:
①无向图的邻接矩阵:
 是唯一的对称矩阵,可以压缩存储(仅存储上/下三角);
 第i行(列)非零元素为第i个顶点的度
②有向图的邻接矩阵:
 第i行(列)的非零元素为第i个顶点的出度(入度);
③邻接矩阵的局限性:要确定多少边必须按行列检测,花费时间的代价很大。
④用于确定两点之间是否有边非常方便
⑤设图G邻接矩阵为A,A的n次方元素A^n[i][j]等于由顶点i~j长度为n的路径的数目
 适用:存储稠密图
 空间复杂度:O(n2);其中n为图顶点数|V|
3、存储结构定义

1 #define maxVertexnum 100
2 typedef struct{
3 int V[maxVertexnum];//顶点表
4 int edge[maxVertexnum][maxVertexnum];//边表
5 int vexnum,arcnum;//当前顶点数,弧数
6 }Mgraph;

二、邻接表
1、描述:对于图G中每个顶点建一个单链表(顶点表结点),第i个单链表中结点表示依附vi的边(边表结点)
2、特点:
①无向图需要的存储空间:O(|V|+2|E|)//无向图中每个边在表中出现2次
  有向图需要的存储空间:O(|V|+|E|)
②稀疏图用这个存储贼省空间!
③优:查一个点有几个关系边很方便
  缺:查入度需要遍历整个表(麻烦),判断两个顶边之间是否存在边效率低
④表示不唯一

3、存储结构定义:

 1 #define maxVertexnum 100
 2 /*边表结点*/
 3 typedef struct ArcNode{
 4 int adjvex; //表示弧指向的顶点位置
 5 struct ArcNode *next;//指向下一条弧的指针
 6 }ArcNode;
 7 /*顶点表结点*/
 8 typedef struct VNode{
 9 VertexType data; //顶点信息
10 ArcNode *first;//指向第一个依附该顶点的弧的指针
11 }VNode,AdjList[maxVertexnum];
12 /*临接表*/
13 typedef struct{
14 AdjList vertex; //邻接表
15 int vexnum,arcnum;//图的顶点数与弧数
16 }ALGraph

三、十字链表【针对有向图】
描述:一种链式存储的结构。
1、特点:
①每一条边用一个结点表示
②顶点之间是顺序存储
③很容易求顶点出度与入度
④表示不唯一,但唯一确定一个图
       
2、组成:
弧结点:尾域tailvex/头域headvex/链域hlink(指向弧头相同的下一条弧)/尾域tlink(指向弧尾相同的下一条弧)/数据域(data)

光描述有点抽象 上个图

3、存储结构定义

 1 #define maxVertexNum 100
 2 /*边表结点*/
 3 typedef struct ArcNode{
 4 int tailvex,headvex;//弧的头尾结点
 5 struct ArcNode *hlink,*tlink;//分别指向弧头弧尾相同的结点
 6 int data;
 7 }ArcNode;
 8 /*顶点表*/
 9 typedef struct VNode{
10 VertexType data;//顶点信息
11 ArcNode *firstin,*firstout;//指向第一条入弧和出弧
12 }VNode;
13 /*邻接表*/
14 typedef struct{
15 VNode xlist[maxVertexNum];//邻接表
16 int vexnum,arcnum;//记录图的顶点数与弧数
17 }GLGraph;

四、邻接多重表【针对无向图】

描述:为了解决邻接表判断两顶点之间是否存在边或者需要对边执行删除操作效率低的问题而诞生
      所有依附于同一顶点的边串联在同一链表中
1、特点:
①每条边只有一个结点
②每个边结点同时连接在两个链表中

二、组成:
边结点:
        mark(标识域,用于标记该边是否被搜索过。)
        ivex/jvex(该边依附的两顶点在图中的位置)
        ilink/jlink(指向下一条依附于顶点ivex/jvex的边)
        data/(数据域)

上个图

三、存储结构定义

 1 #define maxVertexNum 100
 2 /*边表结点*/
 3 typedef struct ArcNode{
 4 bool mark; //访问标记
 5 int ivex,jvex;//分别指向该弧的两个结点
 6 struct ArcNode *hlink,*tlink;//分别指向弧头弧尾相同的结点
 7 int data;
 8 }ArcNode;
 9 /*顶点表*/
10 typedef struct VNode{
11 VertexType data;//顶点信息
12 ArcNode *firstedge;//指向第一条依附该顶点的边
13 }VNode;
14 /*邻接表*/
15 typedef struct{
16 VNode adjmulist[maxVertexNum];//邻接表
17 int vexnum,arcnum;//记录图的顶点数与弧数
18 }AMLGraph;
时间: 2024-10-12 16:49:15

14 图的基础知识-几种常用的存储结构的相关文章

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.3. 顺序索引  vs 散列索引2 1.4. 按索引与数据的查找顺序可分为 正排与倒排索引2 1.5. 单列索引与多列索引 复合索引2 1.6. 分区索引和全局索引 2 1.7.  Trie树一般指字典树 又称单词查找树,Trie树2 1.8. 稠密索引 vs 稀疏索引3 1.9. 多级索引 vs 单击索引3 1.10.

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.2. 按索引与数据的查找顺序可分为 正排与倒排索引1 1.3. 单列索引与多列索引2 1.4. 分区索引和全局索引 2 2. 索引建立,更新的流程使用触发更新索引的事件2 3. 索引常用的存储结构 B树文件 叫做“索引顺序存取方法”(Indexed Sequential Access Method),缩写为ISAM.2 4.  Trie

图的基础知识

1.概念 图: 是一种复杂的非线性数据结构.图的二元组定义:  图 G 由两个集合 V 和 E 组成,记为:  G=(V, E)  其中: V 是顶点的有穷非空集合,  E 是 V 中顶点偶对(称为边)的有穷集. 通常,也将图 G 的顶点集和边集分别记为 V(G) 和 E(G) . E(G) 可以是空集.若 E(G) 为空,则图 G 只有顶点而没有边. 有向图: 若图 G 中的每条边都是有方向的,则称 G 为有向图 (Digraph) .无向图: 若图 G 中的每条边都是没有方向的,则称 G 为

MySQL 基础知识(基本架构、存储引擎差异)

前言: // MySQL 并发.异步IO.进程劫持 最近在看高性能 MySQL,记录写学习笔记: 高性能 MySQL 学习笔记(一) 架构与历史 笔记核心内容:MySQL 服务器基础架构.各种存储引擎之间的主要区别,以及这些区别的重要性: 一.MySQL 逻辑架构 如图: 第一层架构图: 也就是最上层的服务并不是 MySQL 独有的,大多数基于网络的客户端/服务器的工具或者服务器都有类似的架构,比如链接处理,授权认证,安全等等 : // 每个客户端连接都会在服务器进程中拥有一个线程这连接查询只会

数据库基础知识整理,常用函数及常用语法

1常用数据库聚合函数max()min()sum()avg()count() 2字符串处理函数len() 与 datalength()  区别:len是返回字符长度  datalength是返回字节长度LTrim()  RTrim() Trim ()isnull(@FilterStr,N'')如果时空将其替换 charindex(N';', @TmpList)返回字符串中表达式的起始位置而不是indexpaitndex('%ssd%',@temp) 与charindex作用基本类似 substri

python 基础学习 几种常用数据类型

Python3多了一个集合 Python3 数字(Number)Python3 字符串Python3 列表Python3 元组Python3 字典Python3 集合 Python字符串字符串或串(String)是由数字.字母.下划线组成的一串字符. 加号 + 是列表连接运算符,星号 * 是重复操作.如下实例:python的字串列表有2种取值顺序: 从左到右索引默认0开始的,最大范围是字符串长度少1从右到左索引默认-1开始的,最大范围是字符串开头 如果你要实现从字符串中获取一段子字符串的话,可以

web开发基础知识之html常用标签和dom结构

HTML DOM是HTML Document Object Model(文档对象模型)的缩写,HTML DOM则是专门适用于HTML/XHTML的文档对象模型.熟悉软件开发的人员可以将HTML DOM理解为网页的API.它将网页中的各个元素都看作一个个对象,从而使网页中的元素也可以被计算机语言获取或者编辑. 基本标志:  1.<html></html>  2.<head></head>  3.<body></body>  4.<

C#基础知识整理:C#类和结构(1)

1.结构功能特性? 实现代码?结构用struct关键字定义的,与类类似,但有本质区别.结构实质是一个值类型,它不需要对分配的.结构的特性:(1).结构作为参数传递时,是值传递.(2).结构的构造函数必须带参数的.(3).结构实例化可以不用new的.(4).结构不能继承,但是可以实现接口.(5).结构中不能初始化实例字段.例:  using System; using System.Collections.Generic; using System.Text;  namespace TestStr

《大话设计模式》笔记-基础知识1:UML类图基础知识

好多计算机技术书籍或者文章中常用到UML类图,本书作者介绍每一种设计模式就是用类图+面向对象语言小程序(用的C#,其基础知识另文介绍)+人物对话解释知识点.本文就是介绍<大话设计模式>中所用到UML类图的基础知识. 上图是一个整体的图,特别要注意各种样式的箭头,下文分别用局部小图说明各知识点. 类 类图分三层: (1)      类名称,如果是抽象类就用斜体标识.本例,类名称是"动物",且其是一个抽象类. (2)      类特性,通常是字段和属性.本例,类特性是"