Skip to content

Latest commit

 

History

History
104 lines (53 loc) · 5.19 KB

lecture15_BFS_Graph API_implementations - 副本.md

File metadata and controls

104 lines (53 loc) · 5.19 KB

BFS(广度优先搜索)

不同于典型的DFS,典型的BFS并不基于递归,并且其中运用了数据结构Queue(队列,后进 addLast() 先出 removefirst())。BFS的主要原理如下所示:

image-20220613193354778

基于与DFS上一章同样的图,对BFS的整个算法流程进行阐述:

image-20220613195133275

这里讨论的是s——t的无权重最短路问题,即找出每个vertex距离source的最短路径有多长。为解决这一问题,BFS(BreadthFirstPaths)本身需要维护3个Array,即marked,edgeTo以及distTo(相比之下s-t connect问题中,DFS只需要维护两个Array,即marked以及edgeTo)

image-20220613195858339

image-20220613195913588

image-20220613195918024

image-20220613195923212

image-20220613195927331

image-20220613195931639

image-20220613195935719

image-20220613195939886

image-20220613195944032

image-20220613195951948

image-20220613195956025

image-20220613200000093

image-20220613200004108

image-20220613200008948

image-20220613200012822

image-20220613200016905

image-20220613200020603

image-20220613200024397

image-20220613200028672

Graph API

如果我们需要切实的implement我们的DFS和BFS算法,我们需要以下两个东西:

image-20220613201105548

  • Graph API
  • 某种用于代表Graph的数据结构

事实上,几乎所有的Graph API都会对所有的vertices进行编号,如下图所示:

image-20220613201603471

下图为普林斯顿提供的Graph API:

image-20220613203855831

计算每个vertex的degree的函数:

image-20220613203958711

打印出图的所有边的关系的函数:

image-20220613204250027

The data structure to represent Graph

  • 邻接矩阵(Adjacency Matrix):

image-20220613204555321

利用这种邻接矩阵实现求解每个节点的邻居,需要Θ(V²)的时间复杂度:

image-20220613210038270

  • HashSet 即利用Hash集合表示所有边:

image-20220613210150027

  • Adjacency Lists(邻接列表,最为流行的一种表示方法)

image-20220613210257295

采用邻接列表完成求解每个节点的邻居,需要Θ(V+E)的时间复杂度:

image-20220613210504976

上述三种data structure对于Graph API中大部分操作的时间复杂度需要:

image-20220613211243997

最后是普林斯顿对于Graph API的implementation:

image-20220613211353250