`
- 浏览:
82913 次
- 性别:
- 来自:
西安
-
图的存储结构也叫图的存储表示和图的表示,主要介绍3种:邻接矩阵、邻接表、边集数组
1、邻接矩阵(adjacency matrix)表示图形中顶点之间相邻关系的矩阵。amx[i,j]=1,表示i,j之间存在边的关系,若为0则表示二者之间无边的关系。无向图的邻接矩阵是按照主对角线对称的,
有向图则不是。若是带权图,则把1换成相应的权值即可。
因邻接矩阵中的元素可以随机存取,所以查找一条边的时间复杂度为O(1)。
由于求任一顶点的度需要访问对应一行或者一列中的所有元素,所以其时间复杂度为O(n);
图的邻接矩阵的存储需要暂用n*n个实数存储空间,所以其空间复杂度为O(n^2)。若用于存储稠密图能够充分利用存储空间,但若是用于表示稀疏图,则使邻接矩阵变为稀疏矩阵,从而造成存储空间的很大浪费。
2、邻接表(adjacency matrix)是对图中的每个顶点建立一个邻接关系的单链表,并把它们的表头指针用一维数组(向量)存储的一种图的表示方法。邻接表中每个结点用来存储一条边的信息,因而称之为边结点。边结点通常包含3个域:邻接点域,用来存储顶点的一个邻接顶点的序号;权值域,用来存储边上的权;邻接域,用来存储邻接表中的下一个边结点。
每个顶点单链表的平均长度为e/n(对于有向图)或2e/n(对于无向图),其中e是边数,n是点数。所以查找运算的时间复杂度为O(e/n)。对于需要经常查找顶点入边或入边邻接点的运算,可以专门建立一个逆邻接表,该表中每个顶点的单链表不是存储该顶点的所有出边的信息,而是存储所有边的入边信息,邻接点域存储的是入边邻接点的序号。
3、边集数组(edgeset array)是利用一维数组存储图中所有边的一种图的表示方法。数组中的每个元素存储一条边的起点、终点(对于无向图,可选定边的任一端点为起点或终点)、和权值,边的的信息在数组中可以任意安排。边集数组中只存储图中所有边的信息,若需要存储顶点的信息,同样需要一个具有n个元素的一维数组。在边集数组中查找一条边或一个顶点的度都需要扫描整个数组,所以时间复杂度是O(e),空间复杂度为O(e)。从空间复杂度上讲,边集数组也适合表示稀疏图。
图的遍历:深度优先+广度优先
深度优先搜索遍历(depth-first search):类似于树的先序遍历,是一个递归的过程。对图进行深度优先搜索遍历时得到的顶点序列不是唯一的。图的深度优先搜索遍历的过程分为两个函数定义来实现,一个驱动函数,另一个工作函数。驱动函数为一个非递归函数,它起到与外界接口和调用内部递归函数的作用;工作函数是只允许在图类内部调用的私有递归函数,该函数具体完成对图中每个顶点的访问任务。
对邻接矩阵表示的图进行深度优先搜索遍历时,可能需要扫描邻接矩阵中的每一个元素,其时间复杂度为O(n^2);对邻接表表示的图进行深度优先遍历时,可能需要扫描邻接表中的表头数组的每个元素和所有边结点,其时间复杂度为O(n+e);二者的空间复杂度均为O(n)
广度优先搜索遍历(breadth-first search):类似于树的按层遍历。
同样对图的广度优先遍历也要两个函数,一是用于外部接口的驱动函数,二是完成访问所有顶点的工作函数;
在工作函数中需要使用一个队列,用来依次记住被访问过的顶点。函数开始时,对初始点访问后插入队列中,以后每从对队列中删除一个元素,就依次访问它的每一个未被访问过的邻接点,并令其进队,这样,当队列为空时,表明所有与初始点有路径相通的顶点都已访问完毕,算法就结束了。
对于非连通图,需要以图中未被访问到的每一个顶点作为起始点,再次调用搜索遍历方法即可;
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
(1)画出如图(1)所示无向图的邻接矩阵和邻接表,列出该图的广度优先遍历和深度优先遍历结果(选定A为出发点进行遍历)。 (2)画出如图(2)所示有向图的邻接矩阵和邻接表,列出该图的广度优先遍历和深度优先遍历...
Page是InnoDB存储结构中最基本的单位,通常每个Page的大小为16KB。在InnoDB中,数据和索引都被存储在一系列的Page中,这些Page组成B+树,以便快速查找和访问数据。B+树是一种适合数据库索引的数据结构,它的叶子节点...
本PPT讲解了Oracle数据库的逻辑存储结构、物理存储结构,以及在界面操作下的数据库创建
线性表的资源存储结构 小甲鱼视频中的一部分线性表的资源存储结构 小甲鱼视频中的一部分线性表的资源存储结构 小甲鱼视频中的一部分线性表的资源存储结构 小甲鱼视频中的一部分
在接触式存储卡的结构(图1)中,我们可以看到安全逻辑电路是关键组件之一。这个电路的主要任务是管理对存储器的访问,确保数据的安全性。基本的安全逻辑可能仅限于保护整个存储器或者特定区域的写入和擦除操作,...
线性表是计算机科学中一种基础的数据结构,它是由相同类型元素...理解并熟练掌握链式存储结构及其操作,对于学习更复杂的数据结构如树、图等都至关重要。在实际编程中,合理利用链表可以提高程序的运行效率和灵活性。
### 头歌数据结构图的邻接矩阵存储及遍历操作 #### 一、邻接矩阵存储 在数据结构中,图是一种常见的非线性结构,用于表示对象间的关系。根据边是否有方向,图可以分为有向图和无向图。而根据边是否具有权重值,又...
"Java中树的存储结构实现示例代码" 树是一种非线性结构,Java中树的存储结构实现示例代码中,树的存储结构是一种重要的数据结构。树的存储结构可以分为两种:一是数组存储结构,二是链表存储结构。在Java中,通常...
在这个实验“数据结构之图存储结构”中,我们将深入探讨图这一重要的数据结构及其在C语言中的实现。 图是一种非线性的数据结构,由一组顶点(或节点)和连接这些顶点的边组成。它广泛应用于网络路由、社交网络分析...
Oracle 数据库的物理存储结构是其核心组成部分,它涉及到数据在操作系统层面上的实际存储和管理。这一章主要探讨了如何规划和管理Oracle数据库的物理存储结构,以确保数据的安全性和高效性。 首先,理解Oracle...
Linux 存储结构分析图
线性表可以有多种存储方式,其中顺序存储结构是基础且常用的一种。本文将深入探讨C语言中线性表顺序存储结构的实例详解,从而帮助读者更好地理解并掌握这一知识点。 一、顺序存储结构的定义 顺序存储结构是指用一段...
### 二、头歌数据结构图的邻接表存储 #### 1. 数据类型定义 - **顶点类型**:`VertexType` 定义为一个字符数组,用于存储顶点的名称。 - **图的种类**:`GraphKind` 定义了四种类型的图:有向图 (DG)、有向网 (DN)...
尚硅谷学习分享
数据库存储结构.。
数据结构的逻辑结构与存储结构
浅析顺序结构存储的栈 顺序结构存储的栈是一种常用的数据结构,它允许用户在栈的尾部进行插入和删除操作。下面将对顺序结构存储的栈进行详细的分析。 栈的定义:栈是一种特殊的线性表,它只允许在表尾进行插入和...
数据库存储结构是数据库管理系统(DBMS)中至关重要的组成部分,它决定了数据如何在磁盘或内存中组织,以及如何高效地访问和操作这些数据。在本资料“CH7 数据库存储结构”中,我们将深入探讨数据库的存储结构,主要...
1.基于顺序存储结构的图书信息表的创建和输出 问题描述定义一个包含图书信息 (书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行输出每本图书的信息。...