图的搜索(一):广度优先搜索算法和深度优先搜索算法

图的搜索(一):广度优先搜索算法和深度优先搜索算法

本章主要记录了图的搜索算法,和可以解决图的基本问题——最短路径问题的算法。本章主要对图搜索的相关算法进行了介绍:广度优先搜索算法、深度优先搜索算法。

下一章将继续介绍:贝尔曼-福特算法、狄克斯特拉算法、A*算法。


离散数学中的图

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第1张图片

上图中的圆圈叫作“顶点”(也叫“结点”),连接顶点的线叫作“边”。也就是说,由顶点和连接每对顶点的边所构成的图形就是图。

加权图

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第2张图片

有权的边就可以表示顶点之间的“连接程度”

有向图

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第3张图片

可以控制方向。

同时,有向图也可与加权图结合

根据搜索的顺序不同,图的搜索算法可分为“广度优先搜索”和“深度优先搜索”这两种。

广度优先搜索

广度优先搜索是一种对图进行搜索的算法。假设我们一开始位于某个顶点(即起点),此时并不知道图的整体结构,而我们的目的是从起点开始顺着边搜索,直到到达指定顶点(即终点)。在此过程中每走到一个顶点,就会判断一次它是否为终点。广度优先搜索会优先从离起点近的顶点开始搜索。

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第4张图片

设置A为起点,G为终点。从A开始搜索,将可以从A直达的三个顶点BCD设为下一步候补顶点。

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第5张图片

从候补顶点中选出一个顶点。优先选择最早成为候补的那个顶点,如果多个顶点同时成为候补,那么可以随意选择其中一个。

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第6张图片

此处选择了B,继续往下搜索。将可以从 B 直达的两个顶点 E 和 F 设为候补顶点。**此时,最早成为候补顶点的是C和D,于是需要回到C和D继续往下。**依次循环,直到找到目标点。

这个例子的搜索顺序为:A、B、C、D、E、F、H、I、J、K。

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第7张图片

注意:候补顶点是用“先入先出”(FIFO)的方式来管理的,因此可以使用“队列”这个数据结构。(数据结构复习:链表、数组、栈、队列、哈希表、堆、二叉树-CSDN博客)

广度优先搜索的特征为从起点开始,由近及远进行广泛的搜索。因此,目标顶点离起点越近,搜索结束得就越快。

*以上例子,没有闭环的图叫做“树”。如果图为闭环(起点和终点是同一个顶点),则搜索步骤相同。

深度优先算法

与广度优先搜索不同,深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止,然后再折返,开始搜索下一条候补路径。

图的搜索(一):广度优先搜索算法和深度优先搜索算法_第8张图片

主要的区别在于候补顶点的选择不同。与广度优先搜索算法相同,起点从A开始,并从B、C、D开始往下选择。随机选择了B后,候补顶点变为E、F。与广度优先搜索算法不同的是,此处则继续选择最新成为候补顶点的点开始往下继续搜索

这个例子搜索顺序为: A、B、E、K、F、C、H。

候补顶点是用“后入先出”(LIFO)的方式来管理的,因此可以使用“栈”这个数据结构。(数据结构复习:链表、数组、栈、队列、哈希表、堆、二叉树-CSDN博客)

深度优先搜索的特征为沿着一条路径不断往下,进行深度搜索。

参考资料:我的第一本算法书 (石田保辉 宮崎修一)

你可能感兴趣的:(算法基础学习,宽度优先,深度优先,算法,学习)