✅ 操作成功!

广度优先算法

发布时间:2023-06-11 作者:admin 来源:文学

广度优先算法

广度优先算法

-

2023年3月4日发(作者:猪脚皮)

DFS

BFS

的比较

姓名:班级:学号:

一、图的遍历

1.

图的遍历的含义

图的遍历是指从图中某结点出发,按某既定方式访问图中各个可访问到的结

点,使每个可访问到的结点恰被访问一次。

2.

图的遍历方式:深度优先与广度优先

二、DFS与BFS的区别

1.概念

深度优先遍历可定义如下:首先访问出发点

v

,并将其标记为已访问过;然

后依次从

v

出发搜索

v

的每个邻接点

w

。若

w

未曾访问过,则以

w

为新的出发

点继续进行深度优先遍历,直至图中所有和源点

v

有路径相通的顶点

(

亦称为从

源点可达的顶点

)

均已被访问为止。若此时图中仍有未访问的顶点,则另选一个

尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问止。

广度优先遍历可定义如下:假设从图中某顶点v出发,在访问了v之后依次

访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的

邻接点,并使“先被访问的顶点的邻接点”先与“后被访问的顶点的邻接点”被

访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点

未被访问,则另选图中一个曾被访问的顶点作起始点,重复上述过程,直至图中

所有顶点都被访问到为止。

2.

路径

深度优先就是,从初始点出发,不断向前走,如果碰到死路了,就往回走一

步,尝试另一条路,直到发现了目标位置。这种方法,即使成功也不一定找到一

条好路,但是需要记住的位置比较少。

广度优先就是,从初始点出发,把所有可能的路径都走一遍,如果里面没有

目标位置,则尝试把所有两步能够到的位置都走一遍,看有没有目标位置;如果

还不行,则尝试所有三步可以到的位置。这种方法,一定可以找到一条最短路径,

但需要记忆的内容实在很多,要量力而行。

3.

算法实现

(1)

图的深度优先算法的一般性描述:

longDFS(

s

,结点

v

)

{//

从结点

v

。出发,深度优先遍历图

s

,返回访问到的结点总数

intnNodes;//

寄存访问到的结点数目

访问

v

;

v

。置为已访问标志

;

nNodes=1;

求出

v

。的第

1

个可达邻接点

v;

while(v

存在

)

{

if(v

未被访问过

)nNodes=nNodes+DFS(s,v);

求出

v

。的下个可达邻接点

v;

}

returnnNodes;

}

(2)

图的广度优先算法的一般性描述:

longBFS(

s,

结点

v

。)

{//

在图

s

中从

v

。出发按广度优先遍历方式遍历

s

,返回遍历到的结点数目

longnNodes=0;

初始化队列

q;

if

v

。存在)

{v

。入队列

q;

v

。为已访问标志

;

}

while(q

不空

)

{

队列

q

的队头元素出队并送

v;

访问

v;

nNodes++;//

对已访问元素计数

求出

v

的第一个可达邻接点

w;

while(w

存在

)

{

if(w

尚未被访问过

)

{

w

q;

w

为已访问标志

;

}

v

的下个可达邻接点

w;

}

returnnNodes;

}

综上所述,广度优先和深度优先各有优劣之处。一般情况下,深度优先算法

占内存少但速度较慢,广度优先算法占内存多但速度较快,在距离和深度成正比

的情况下能较快地求出最优解。深度优先与广度优先的控制结构和产生系统很相

似,唯一的区别在于对扩展节点选取上。由于其保留了所有的前继节点,所以在

产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。这两种算法

每次都扩展一个节点的所有子节点,而不同的是,深度优先下一次扩展的是本次

扩展出来的子节点中的一个,而广度优先扩展的则是本次扩展的节点的兄弟点。

在具体实现上为了提高效率

,

所以采用了不同的数据结构。因此在选择用哪种算

法时,要综合考虑,使达到最优效果。

👁️ 阅读量:0