本人这两种算法在课上没好好学过,只能通过读别人写的书和博客进行学习,如有个别雷同,希望见谅(那说明那个人写的一定很好a)。
在网上和书上看了不同的实现方法,我觉得有一种基于邻接矩阵的方法不错,那就做做笔记吧。
在我们讨论这两种图的基本搜索方法时,我们先来定义一下我们的图吧,确定一下图的存储结构。
深度优先遍历算法(DFS)
深度优先搜索的思想大致可以这么说:
这是一个不断的探查与回溯的过程。在探查的每一步,都会有一个当前顶点v,每一步探查,都会先访问当前顶点,然后将其设一个标志来标记已访问过。接着在它的邻接顶点中,找出未访问的一个,将其作为下一个当前顶点v’,如果所有的邻接顶点都被访问过了,那么我们返回上上步,将前一步所访问的顶点作为当前顶点,重复上述过程即可。
通俗点讲,就是我们每做的一步都要一探到底,到了底在掉头回去找其他路,优先纵向搜索。
那么我们一边看代码一边再做一次理解吧。
广度优先遍历算法(BFS)
广度优先遍历是一个逐层遍历的过程。
在这个过程中,图中有多少个顶点就要重复多少步,在每一步中,规定一个当前顶点v,并设置它是被访问过的,接着依次访问v的各个未曾被访问过的邻接顶点,然后再顺序访问这些邻接顶点的未访问过的邻接节点。再从这些未访问过的顶点中,继续重复上述步骤。直到所有的顶点都被访问过为止。
通俗点讲,就是逐层递进,优先横向搜索。
贴代码;
设顶点数为n,那么这两种遍历方法的时间复杂度都是O(n^2);