常读常新
这里多分析了三个点:
1. 两种表示方式在另一个维度的比较;
2. 一种复杂应用场景下的取舍办法;
3. 经典表示方法之外的黑科技。
众所周知,在经典的图论里,图的两种表示方式为:
1. 邻接矩阵;
2. 邻接表。
先回顾一下,图是由结点,以及结点之间的边构成的。结点一般编号为0,1,2,……,然后一条边由<u, v[,w]>
来定义,其中的u和v都是某个结点的编号(如果有w的话,表示这条边的权重)。
图还分为有向图和无向图,其实本质上并没区别,可以说一切图都是有向图,而无向图只不过是每条有向边都存在一条反方向的边而已(两个结点可以直接互通,谓之无向,在这里,“方向”表示通行的限制)。
记号声明
- E,表示整张图的边(edge)的数量;
- V,表示整张图的顶点(vertex)的数量;
- 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
- 优点:可以在常数时间内得到一条边的权重;
- 缺点:占用内存多,特别是对于稀疏图来说;
- 缺点:没法保证在O(e)时间内遍历某个结点的所有边。
稍微解释一下,对于1,因为矩阵可以随机存取元素,所以可以在常数时间内知道两个结点之间是否存在一条边。
对于2,很明显矩阵占用的内存是顶点的数量的平方,对于稀疏图来说,很浪费内存。
对于3,比如想遍历结点1的所有边(在这里只有1条),但没法只访问1次,而是必须得访问V(=3)次,才能得出所有与1相邻的边。
邻接表
用矩阵对于稀疏图来说ÿ