好文档 - 专业文书写作范文服务资料分享网站

广度优先搜索和深度优先搜索

天下 分享 时间: 加入收藏 我要投稿 点赞

有两种常用的方法可用来搜索图: 即深度优先搜索和广度优先搜索。 它们最终都会到达所有

连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。

深度优先搜索:

深度优先搜索就是在搜索树的每一层始终先只扩展一个子节点,不断地向纵深前进直到不能再前进(到达 叶子节点或受到深度限制)时,才从当前节点返回到上一级节点,沿另一方向又继续前进。这种方法的搜 索树是从树根开始一枝一枝逐渐形成的。

下面图中的数字显示了深度优先搜索顶点被访问的顺序。

\严-*

4

t C '4 --------------------------------- --- _

为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:

(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。 (2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。 (3) 如果不能执行规则1和规则2,就完成了整个搜索过程。

广度优先搜索:

在深度优先搜索算法中,是深度越大的结点越先得到扩展。如果在搜索中把算法改为按结点的层次进行搜 索,本层的结点没有搜索处理完时,不能对下层结点进行处理,即深度越小的结点越先得到扩展,也就是 说先产生的结点先得以扩展处理,这种搜索算法称为广度优先搜索法。

在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。相反,在广度优先搜索中, 算法好像要尽可能地靠近起始点。 域。它是用队列来实现的。

下面图中的数字显示了广度优先搜索顶点被访问的顺序。

它首先访问起始顶点的所有邻接点,

然后再访问较远的区

实现广度优先搜索,也要遵守三个规则:

⑴ 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插 入到队列中。

(2) 如果因为已经没有未访问顶点而不能执行规则 1

时,那么从队列头取一个顶点,并使其 成为当前顶点。

(3) 如果因为队列为空而不能执行规则 2,则搜索结束。

广度优先搜索

类剔: 搜索算法

数据结构:图

时间复杂感0( I叭+ |虔D二Q們 空「可复杂度 od ^|+|j|)= cx^) 最佳解: 是 完全生

BFS是一种盲目搜寻法,目的是系统地展开并检查 图中的所有节点,以找寻结果。换句 话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。 使用经验法则算法。

从算法的观点,所有因为展开节点而得到的子节点都会被加进一个 一般的实作里,其邻居节点尚未被检验过的节点会被放置在一个被称为 (例如伫列或是链表),而被检验过的节点则被放置在被称为 (open-closed 表)

先进先出的伫列中。

BFS并不

open的容器中

closed的容器中。

实作方法

1. 首先将根节点放入伫列中。

2. 从伫列中取出第一个节点,并检验它是否为目标。

o如果找到目标,则结束搜寻并回传结果。

o 否则将它所有尚未检验过的直接子节点加入伫列中。

3. 若伫列为空,表示整张图都检查过了一一亦即图中没有欲搜寻的目标。结束搜 寻并回传“找

不到目标”。 4. 重复步骤2。

C的实作

广度优先搜索算法: void BFS(VLi nk G[], i nt v) { int w; VISIT(v); visited[v] = 1; ADDQ(Q,v); while(!EMPTYQ(Q)) { v = DELQ(Q); while(w != -1) { if(visited[w] == 0) { VISIT(w); ADDQ(Q,w); visited[w] = 1; }

w = NEXTADJ(G,v); /* } } }

/* /*

訪問頂點v*/

頂點v對應的訪問標記置爲

1*/

/*

退出隊頭元素v*/

求v的第1個鄰接點。無鄰接點則返回

w = FIRSTADJ(G,v); /*

-1*/

/* /* /*

訪問頂點v*/

當前被訪問的頂點w進隊*/ 頂點w對應的訪問標記置爲

1*/

-1*/

求v的下一個鄰接點。若無鄰接點則返回

对图G=(V,E)进行广度优先搜索的主算法如下。 void TRAVEL_BFS(VLi nk G[], i nt visited[], i nt n) { int i;

for(i = 0; i < n; i ++) { visited[i] = 0; }

for(i = 0; i < n; i ++) if(visited[i] == 0) BFS(G,i); }

/*

標記數組賦初值(清零)

*/

深度优先搜索是图论中的经典算法, 利用深度优先搜索算法可以产生目标图的相应 拓扑 排序表,利用拓扑排序表可以方便的解决很多相关的

图论问题,如最大路径问题等等。

广度优先搜索和深度优先搜索

有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。它们最终都会到达所有连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。深度优先搜索:深度优先搜索就是在搜索树的每一层始终先只扩展一个子节点,不断地向纵深前进直到不能再前进(到达叶子节点或受到深度限制)时,才从当前节点返回到上一级节点,沿另一方向又
推荐度:
点击下载文档文档为doc格式
11rdk14gma7d82u9zjlx7yogl1itk200iq7
领取福利

微信扫码领取福利

微信扫码分享