搜索算法:广度优先搜索与深度优先搜索

一.广度优先搜索

广度优先搜索缩写BFS,是一种一个节点一个节点便利的搜索方式。常用来算最短路径的问题。

如图:

搜索算法:广度优先搜索与深度优先搜索_第1张图片

像这样的一个迷宫,从s1开始。怎么走才算BFS呢?

从定义可以看出,我们就是要一个节点一个节点的走。从s1开始,走到下一层到s2.但是这次有两种情况,第一种情况是从s2到下一层,或者到与s2同层的s3与s4,而这种,就是广度优先算法的思想。

第一种就是深度优先算法,我们暂不做讨论。

广度优先搜索基本知识:

基本思想:

从初始状态S 开始,利用规则,生成所有可能的状态。构成的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则,生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。

这就是BFS 的一个过程, 每个方块表示一个状态, 浅蓝色的表示遍历了该状态。广度优先即是要按层数一层一层来遍历,先将一层全部扩展,然后再进行下一层。

我们的搜索顺序就是第一层->第二层->第三层->第N层。

恰好利用队列就可以利用先进先出的思想来解决这一问题(先进入的节点等同一层所有节点进入完毕后先出)。

比如:

搜索算法:广度优先搜索与深度优先搜索_第2张图片

 先后顺序就是下面在这样的情况:

求最短路径问题的思想:

我们假设终点在第N层,因此我们搜索到的路径长度肯定是N,而且这个N一定是所求最短的。

证明:假设终点在第N层上边出现过,例如第M层,M 所以根据广度优先搜索的话,搜索到终点时,该路径一定是最短的。

经典例题:

请戳这里=v=。

深度优先搜索:

深度优先搜索(缩写DFS),有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。

相对于广度搜索,深度优先搜索就有提前找到钟点的可能,所以降低了内存的消耗度,甚至有可能会降低所需要的时间。但是缺点也十分明显,那就是求不出最优解:一个个节点的深入必然会求出一个解,但是说不定最优解在更后面的节点。

基本思想:

从初始状态,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生成新状态节点),当它仍不是目标状态时,回溯到上一层结果,取另一可能扩展搜索的分支。采用相同办法一直进行下去,直到找到目标状态为止。

对于深度优先搜索,也有一个容器可以完美的匹配他的思想,那就是栈的先进后出思想。

具体实现过程

1 每次取出栈顶元素,对其进行拓展。

2 若栈顶元素无法继续拓展,则将其从栈中弹出。继续1过程。

3 不断重复直到获得目标状态(取得可行解)或栈为空(无解)。

经典例题:

请戳这里=v=。

 

你可能感兴趣的:(c++学习心得)