图的两种表示和接口

本文分析了图的两种经典表示方式——邻接矩阵和邻接表,讨论了它们的优缺点。邻接矩阵在常数时间内获取边的权重,但内存消耗大,适合稠密图。邻接表节省内存,适用于稀疏图,但在获取边权重时效率较低。在需要同时满足快速获取权重和遍历边的需求时,提出了结合两者特点的解决方案,并分享了一种使用map实现的“黑科技”,在特定场景下提高效率。
摘要由CSDN通过智能技术生成

常读常新

这里多分析了三个点:
1. 两种表示方式在另一个维度的比较;
2. 一种复杂应用场景下的取舍办法;
3. 经典表示方法之外的黑科技。

众所周知,在经典的图论里,图的两种表示方式为:
1. 邻接矩阵;
2. 邻接表。

先回顾一下,图是由结点,以及结点之间的边构成的。结点一般编号为0,1,2,……,然后一条边由<u, v[,w]>来定义,其中的u和v都是某个结点的编号(如果有w的话,表示这条边的权重)。

图还分为有向图和无向图,其实本质上并没区别,可以说一切图都是有向图,而无向图只不过是每条有向边都存在一条反方向的边而已(两个结点可以直接互通,谓之无向,在这里,“方向”表示通行的限制)。

记号声明

  1. E,表示整张图的边(edge)的数量;
  2. V,表示整张图的顶点(vertex)的数量;
  3. e,表示某个顶点相邻的边的数量。

优缺点分析

先po一张统一的图以便后续分析:

结点为:0, 1, 2
边为:<0, 1, 10>, <1, 2, 66>, <2, 0, 55>

这张图很明显是一个三角形。

邻接矩阵

顾名思义,这种方式是用一个N*N的矩阵来表示图,如果存在边

0   10  0
0   0   66
55  0   0
  1. 优点:可以在常数时间内得到一条边的权重;
  2. 缺点:占用内存多,特别是对于稀疏图来说;
  3. 缺点:没法保证在O(e)时间内遍历某个结点的所有边。

稍微解释一下,对于1,因为矩阵可以随机存取元素,所以可以在常数时间内知道两个结点之间是否存在一条边。
对于2,很明显矩阵占用的内存是顶点的数量的平方,对于稀疏图来说,很浪费内存。
对于3,比如想遍历结点1的所有边(在这里只有1条),但没法只访问1次,而是必须得访问V(=3)次,才能得出所有与1相邻的边。

邻接表

用矩阵对于稀疏图来说ÿ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值