不同于典型的DFS,典型的BFS并不基于递归,并且其中运用了数据结构Queue(队列,后进 addLast() 先出 removefirst())。BFS的主要原理如下所示:
基于与DFS上一章同样的图,对BFS的整个算法流程进行阐述:
这里讨论的是s——t的无权重最短路问题,即找出每个vertex距离source的最短路径有多长。为解决这一问题,BFS(BreadthFirstPaths)本身需要维护3个Array,即marked,edgeTo以及distTo(相比之下s-t connect问题中,DFS只需要维护两个Array,即marked以及edgeTo)
如果我们需要切实的implement我们的DFS和BFS算法,我们需要以下两个东西:
- Graph API
- 某种用于代表Graph的数据结构
事实上,几乎所有的Graph API都会对所有的vertices进行编号,如下图所示:
下图为普林斯顿提供的Graph API:
计算每个vertex的degree的函数:
打印出图的所有边的关系的函数:
- 邻接矩阵(Adjacency Matrix):
利用这种邻接矩阵实现求解每个节点的邻居,需要Θ(V²)的时间复杂度:
- HashSet 即利用Hash集合表示所有边:
- Adjacency Lists(邻接列表,最为流行的一种表示方法)
采用邻接列表完成求解每个节点的邻居,需要Θ(V+E)的时间复杂度:
上述三种data structure对于Graph API中大部分操作的时间复杂度需要:
最后是普林斯顿对于Graph API的implementation: