经典搜索算法之深度优先搜索和广度优先搜索

1.深度优先搜索(DFS)

  深度优先搜索是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,即尽可能的往深处走。如图所示:

                                                                              

   假设我们需要搜索到G,则我们从A出发,A->B->D,到了D发现没有路了,则退回到B,然后B->C->F->G,最终搜索得到G,完整路径为:A->B->C->F->G。深度优先搜索的特点是难以寻找最优解,仅仅只能寻找解。其优点就是内存消耗小。而且深度优先搜索的方法是一条路走到黑,是无法知道这条路是不是最短的,所以还需要继续走别的路去判断是否是最短路。深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。

2.广度优先搜索(BFS)

   广度优先搜索是从一个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

   如上图的深度优先搜索为:A->B->D->C->E->G->F,一般情况下,深度优先搜索法占内存少但速度较慢,广度优先搜索算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解。

   

猜你喜欢

转载自blog.csdn.net/m0_38075425/article/details/81708239