携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
图的遍历
从图中某一顶点出发访遍图中其他顶点,而且使每一个顶点仅被访问一次,这个过程叫做图的遍历。
图遍历要避免因为回路陷入死循环,通常有两种遍历方案:深度优先和广度优先
深度优先遍历
深度优先遍历也称为深度优先搜索(DFS)
如上图,如何从顶点A开始走遍所有的图顶点并作上标记?
从顶点A开始,始终向右手边走,注意,走到最后,还有一个I顶点没走。
深度优先遍历其实就是一个递归的过程,从图右边路径可以看出类似一棵树的前序遍历,确实如此。
从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径想通的顶点都被访问到。
非连通图,只需要对它的连通分量分别进行深度优先遍历,即在先前一个顶点进行一次深度优先遍历后,若图中尚有顶点未被访问,则选图中一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
广度优先遍历
广度优先遍历又称为广度优先搜索(BFS)
深度优先遍历未必是最佳方案,它意味着要彻底查找完一个地方,然后才查找另一个地方。
DFS类似于树的前序遍历,BFS类似于树的层序遍历。
如上图所示,顶点A作为第一层,A的所有边顶点BF作为第二层,BF的所有边顶点CIGE作为第三层,依次类推。
深度优先 VS 广度优先
两种遍历时间复杂度是相同的,不同的是对顶点的访问顺序不同。
两种算法没有优劣之分,视不同的情况选择不同的算法。
- 深度优先更适合目标比较明确,以找到目标为主要目的的情况
- 广度优先更适合在不断扩大遍历范围时找到相对最优解的情况