首页 > 其他分享 >邻接表和邻接矩阵:图的两种存储方式

邻接表和邻接矩阵:图的两种存储方式

时间:2023-07-17 15:37:50浏览次数:42  
标签:存储 邻接矩阵 链表 邻接 如果 顶点

 

引言

图是一种非常重要的数据结构,它可以用来表示很多复杂的现实问题,如网络拓扑、社交关系、地图导航等。为了有效地处理图相关的算法,我们需要选择合适的存储方式来表示图中的顶点和边。本文将介绍图的两种常用存储方式:邻接表和邻接矩阵,并比较它们的优缺点。

邻接矩阵

邻接矩阵是使用二维数组存储图的所有顶点间的关系,矩阵的每一行或一列代表一个顶点,行与列的交点对应这两个顶点的边。例如,下图是一个无向图,它可以用如下的邻接矩阵表示:

 

 ABCDE
A 0 1 1 0 0
B 1 0 1 0 0
C 1 1 0 1 0
D 0 0 1 0 1
E 0 0 0 1 0

邻接矩阵有以下几个特点:

  • 邻接矩阵是正方形的,即横纵维数相等。
  • 矩阵的对角线元素都是0,因为对角线上对应的横纵轴代表相同的顶点,边没有意义。
  • 如果是无向图,那么矩阵是对称的;如果是有向图则不一定是对称的。
  • 如果是有权图,矩阵元素可以是权值;如果是无权图,通常用1表示有边,用0表示无边。
  • 邻接矩阵表示图的关系非常清晰,但消耗空间较大,空间复杂度为 \Theta (V^2) ,其中 V 是顶点数。
  • 邻接矩阵对边的存储、查询、更新等操作快而简单,只需要一步即可访问和修改。
  • 邻接矩阵适合稠密图的存储,存储稀疏图时空间浪费太大;邻接矩阵一般情况下无法存储重边。

邻接表

邻接表是使用一个由链表组成的数组存储图的所有顶点间的关系,图中的每一个顶点都有一个链,数组的大小等于图中顶点的个数。无向图的链的第一个元素是本顶点,后继分别连接着和这个顶点相连的顶点;有向图的链第一个顶点是本顶点,后继是以本顶点为起点的边的终点。例如,上面的无向图可以用如下的邻接表表示:

 

A -> B -> C B -> A -> C C -> A -> B -> D D -> C -> E E -> D

邻接表有以下几个特点:

  • 邻接表使用链表存储每个顶点相邻的顶点,节省空间,空间复杂度为 \Theta (V+E) ,其中 E 是边数。
  • 邻接表访问和修改会变慢,需要遍历链表。
  • 邻接表适合稀疏图的存储,节省空间;邻接表可以存储重边。
  • 邻接表如果是有权图,可以在链表节点中设置权值属性。

比较

邻接矩阵和邻接表各有优缺点,选择哪种存储方式取决于图的特点和算法的需求。一般来说,如果图是稠密的,即边数接近顶点数的平方,那么邻接矩阵更合适;如果图是稀疏的,即边数远小于顶点数的平方,那么邻接表更合适。另外,如果需要频繁地查询和修改边的信息,那么邻接矩阵更合适;如果需要遍历顶点的相邻顶点,那么邻接表更合适。

总结

本文介绍了图的两种常用存储方式:邻接表和邻接矩阵,并比较了它们的优缺点。希望本文能够对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。谢谢!

标签:存储,邻接矩阵,链表,邻接,如果,顶点
From: https://www.cnblogs.com/shoshana-kong/p/17560229.html

相关文章

  • docker分布式存储之哈希槽3主3从redis集群配置+主从扩容缩容
    创建开启六台redis容器systemctlrestartdockerdockerpullredis:6.0.8根据需求下载redis的镜像版本配置3主3从开启六台redis容器分别用node-1~node-6来区分dockerrun-d--nameredis-node-1--nethost--privileged=true-v/tmp/redis/share/redis-node......
  • mysql 查询存储过程调用日志
    如何实现MySQL查询存储过程调用日志作为一名经验丰富的开发者,我将在下面的文章中向你介绍如何实现MySQL查询存储过程调用日志。首先,让我们来了解一下整个流程,然后逐步介绍每一步需要做的事情和相应的代码。流程概述下面是实现MySQL查询存储过程调用日志的整体流程:步骤......
  • aliyun oss对象存储服务的使用和配置
     引入依赖(依赖冲突可使用mavenhelper插件来排除,或者通过启动异常进行判断,或者看官方文档寻找答案) <dependency>   <groupId>com.aliyun.oss</groupId>   <artifactId>aliyun-sdk-oss</artifactId>   <version>3.5.0</version>   <exclusions>  ......
  • MySQL 索引、事务与存储引擎
    目录一、索引1.概念2.作用3.副作用4.创建索引的原则依据5.优化6.分类二、事务1.事务的概念2.事务的特点(1)原子性(2)一致性(3)隔离性(4)持久性3.扩展事务之间的相互影响分为几种4.Mysql及事物隔离级别5.事务控制语句6.使用set设置控制事务三、存储引擎一、索引1.概念是......
  • redis 存储不重复列表
    实现Redis存储不重复列表简介在本文中,我将向你展示如何使用Redis来存储不重复列表。首先,我们需要明确什么是Redis和不重复列表。Redis是一个开源的高性能内存数据库,它提供了多种数据结构和功能,以支持各种应用场景。不重复列表是一个数据结构,其中每个元素只出现一次。在Redis中,我......
  • redis set存储对象
    如何实现RedisSet存储对象概述在Redis中,Set是一种无序且不重复的数据结构,它可以存储多个元素,且操作效率非常高。如果我们想要将对象存储到Redis的Set中,我们需要进行一些额外的处理。本文将详细介绍如何使用Redis来实现Set存储对象的功能。准备工作在开始之前,确保你已经安装了R......
  • 高并发的哲学原理(七)-- 最难以解决的单点:数据库以及它背后的存储
    前面六篇文章,我们解决了web服务的百万QPS问题,从本文开始,我们将用三篇文章,尝试构建出百万QPS后端系统所需要的数据库。首先要明确,这里的数据库指的是关系型数据库,即满足ACID原则并用SQL语言进行操作的持久性(掉电数据不丢)数据库。当然,在追求高并发的过程中,我们将不可避免......
  • 数据库(SQL注入问题、视图、触发器、事务、存储过程、内置函数、流程控制、索引)
    SQL注入问题SQL注入的原因:由于特殊符号的组合会产生特殊的效果 实际生活中,尤其是在注册用户名的时候会非常明显的提示你很多特殊符号不能用,会产生特殊的效果。结论:涉及到敏感数据部分,不要自己拼接,交给现成的方法拼接即可。importpymysql#链接MySQL服务端conn=pymysql.......
  • 5 存储器层次结构
    到目前为止,在对系统的研究中,我们依赖于一个简单的计算机系统模型,CPU执潜令,而存能器系统为CPU存放指令和数据。在简单校型中,存体语系特是不以热的字节数组,而CPU能够在一个常数时间内访问每个存储器位置,组然花然为正露排个有效的模型,但是它没有反映现代系统实际工作的方式。实际上,......
  • 搭建NFS存储服务器--基于CentOS7系统
    一、NFS简介NFS是NetworkFileSystem的缩写,顾名思义就是网络文件存储系统,它最早是由Sun公司发展出来的,也是FreeBSD支持的文件系统中的一个,它允许网络中的计算机之间通过TCP/IP网络共享资源。通过NFS,我们本地NFS的客户端应用可以透明地读写位于服务端NFS服务器上的......