图的的搜索算法主要分为广度优先搜索(breadth-first search或BFS)和深度优先搜索(depth-first search或DFS
广度优先搜索(BFS) -- 利用队列
算法始终首先发现距离起始顶点较近的顶点,然后才发现较远的顶点。假设搜索的出发顶点为s,则首先搜索与s直接相邻的顶点,然后再搜索这些相邻顶点的相邻顶点。在搜索过程中可以记录每个顶点到起始顶点s的距离。这种搜索算法能生成一棵以s为根、包括所有s可达的顶点的广度优先搜索树(BFS树)。图中各顶点的访问次序对应于广度优先搜索树中各节点由顶至底的层次。
实现过程
广度优先搜索:
在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。相反,在广度优先搜索中,算法好像要尽可能地靠近起始点。它首先访问起始顶点的所有邻接点,然后再访问较远的区域。它是用队列来实现的。
下面图中的数字显示了广度优先搜索顶点被访问的顺序。
实现广度优先搜索,也要遵守三个规则:
(1) 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。
(2) 如果因为已经没有未访问顶点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。
(3) 如果因为队列为空而不能执行规则2,则搜索结束。
深度优先搜索(DFS) -- 利用栈
正如算法的名称那样,DFS算法总是尽可能“深”地搜索图。在DFS过程中,某个顶点v在被访问后,将递归地访问第一个尚未被访问过的相邻点,直至没有相邻点可访问为止;然后再回溯到顶点v,继续递归访问v的第二个尚未访问过的相邻点。这一过程一直进行到已访问了起点可达的所有顶点为止。
除了递归方式之外,还可以借助堆栈采用迭代方式实现。首先访问起点v,然后把顶点v及其相连的边压入栈中;弹出并访问栈顶元素,栈顶元素对应的边的另一顶点就是下一个访问的顶点,对其重复顶点v的操作;迭代过程直至栈中没有元素为止。
实现过程
深度优先搜索:
下面图中的数字显示了深度优先搜索顶点被访问的顺序。
为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:
(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。
(2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。
(3) 如果不能执行规则1和规则2,就完成了整个搜索过程。
总结与 两种算法的评价
可能很多人对搜索的想法有点不对,很多人认为搜索是对已知的一棵树或者是已知的图进行搜索,所以我们常常把搜索和遍历给搞混了,但是其实搜索针对的并不是已知的,这并不代表搜索不能用于已知的,搜索一般用于未知的树,或者未知的图,而我们仅仅是知道这个树或图的产生规则。这个时候才会产生深度优先搜索和广度优先搜索。
然后说一下深度优先搜索和广度优先搜索的区别以及适用范围:
广度优先搜索:广度优先搜索是按照树的层次进行的搜索,如果此层没有搜索完成的情况下不会进行下一层的搜索。
深度优先搜索:深度优先搜索是按照树的深度进行搜索的,所以又叫纵向搜索,在每一层只扩展一个节点,直到为树的规定深度或叶子节点为止。这个便称为深度优先搜索。
我先来说说两种算法的不同点。广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索。因为由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的。
适用范围:这点很重要,因为知道两者的适用范围对于编程人员很有好处,至少可以少走弯路。(这些都是开个人观点,有缺少的欢迎补充)
广度优先搜索适用范围:在未知树深度情况下,用这种算法很保险和安全。在树体系相对小不庞大的时候,广度优先也会更好些。
深度优先搜索适用范围:刚才说了深度优先搜索又自己的缺陷,但是并不代表深度优先搜索没有自己的价值。在树深度已知情况下,并且树体系相当庞大时,深度优先搜索往往会比广度优先搜索优秀,因为比如8*8的马踏棋盘中,如果用广度搜索,必须要记录所有节点的信息,这个存储量一般电脑是达不到的。然而如果用深度优先搜索的时候却能在一个棋盘被判定出来后释放之前的节点内存。
当让具体情况还是根据具体的实际问题而定,并没有哪种绝对的好。所以,理解这两种算法的本质是关键。
最后我说说关于找最优解的问题,这种问题如果不依靠其他的辅助算法来说,其实对于广度优先搜索和深度优先搜索来说是一样的,说白了找最优解就是个遍历过程,所以没有哪种算法找最优解更好。但是如果有辅助的启发式算法或者别的算法就另当别论了。
文中内容涉及到的 链接
http://blog.chinaunix.net/uid-26359455-id-2978036.html?page=2
http://blog.csdn.net/andyelvis/article/details/1728378
http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591331.html