前端算法系列(7):图

297 阅读2分钟

概述

图也是节点之间通过指针连接的数据结构

另外图还有一些其他特征

  • 有向和无向
  • 有环和无环

图中的指针(通常在图中称为边)不仅仅是作为节点的一个属性,也用来表示节点之间的关系,换句话说在图中节点(vertex)和边(edge)同样重要。

树在可以认为是一个无向无环图,任意两点之间最多只能有一个路径。

另外还有一些图有关的术语

  • 出度、入度 有向图中以当前顶点为起点和终点的边数目

图的表示

树通常使用链表表示,从根节点出发得到一个唯一的表示。
图中通常没有明确的唯一根节点,常用数组表示。

邻接矩阵

使用数组vertices存储顶点,使用数组edges存储边,其中edges[i][j] 代表节点 i + 1i+1 和 节点 j + 1j+1 之间是否有边。

比如

const vertices = [1, 2, 3, 4, 5]
const edges = 
        [[0, 1, 1, 1, 1],
         [1, 0, 0, 1, 0],
         [1, 0, 0, 0, 1],
         [1, 1, 0, 0, 1],
         [1, 0, 1, 1, 0]]

邻接表

使用数组vertices存储顶点,邻接表edges存储边,其中edges[i]表示与第i个顶点相邻的顶点集合。

比如

const vertices = [1, 2, 3, 4, 5]
const edges = [[1, 2, 3, 4],
         [0, 3],
         [0, 4],
         [0, 1, 4],
         [0, 2, 3]]


当然顶点集合也不一定是数组表示,也可以是链表。

两种方式的选择

邻接矩阵无论边数多少,空间复杂度都是n^2,而邻接表只需要保存实际存在的边,从这个角度稀疏图选择后者。

但邻接矩阵操作较为简单,而且可以保存权重方向等。

相关例题

图常考的包括搜索和拓扑排序,都会在下一章专题中详解。

其他的比如最短路