前面已经说过了深搜和广搜了,是不是有点还不是很好的分清他们?(其实分不分的请都没大有关系)
下面我们来看一看广搜与深搜的区别吧。
算法步骤上的区别
深度优先遍历图算法步骤:
1.访问顶点v
2,。依次从v未被访问过的邻接顶点出发,对图进行搜索(深度优先搜索)直至图中的和v相通的顶点都被访问过;
3.若此时图中尚有顶点未被访问过,则从一个未访问的顶点出发,从新进行深度优先搜索,直到图中的所有顶点均被访问过为止。
上述过程可能比较抽象,举个实例来看看这个算法。
DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,… 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。
接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。
广度优先遍历图算法步骤:
1.现将根节点放入队列中
2。从队列中取出第一个元素(取出:将其从队列中删除)
判断该点是否为所搜索的目标节点,若是,结束搜索并传回结果。 否则将他所尚未搜索到的直接子节点加入队列中。
3.若队列为空,表明整张图都搜过了——即图中没有要搜索的目标节点。结束搜索并传回“找不到目标”
4.下面展示步骤2的图示
两者必须遵守的规则
深度优先搜索:
下面图中的数字显示了深度优先搜索顶点被访问的顺序。为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。(2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。(3) 如果不能执行规则1和规则2,就完成了整个搜索过程。广度优先搜索:在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。相反,在广度优先搜索中,算法好像要尽可能地靠近起始点。它首先访问起始顶点的所有邻接点,然后再访问较远的区域。它是用队列来实现的。下面图中的数字显示了广度优先搜索顶点被访问的顺序。实现广度优先搜索,也要遵守三个规则:(1) 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。(2) 如果因为已经没有未访问顶点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。(3) 如果因为队列为空而不能执行规则2,则搜索结束。