图的的搜索算法主要分为广度优先搜索(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,就完成了整个搜索过程。
总结与 两种算法的评价
可能很多人对搜索的想法有点不对,很多人认为搜索是对已知的一棵树或者是已知的图进行搜索,所以我们常常把搜索和遍历给搞混了,但是其实搜索针对的并不是已知的,这并不代表搜索不能用于已知的,搜索一般用于未知的树,或者未知的图,而我们仅仅是知道这个树或图的产生规则。这个时候才会产生深度优先搜索和广度优先搜索。
文中内容涉及到的 链接
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