深度优先算法与广度优先算法的比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DFS与BFS的比较
姓名:班级:学号:
一、图的遍历
1.图的遍历的含义
图的遍历是指从图中某结点出发,按某既定方式访问图中各个可访问到的结点,使每个可访问到的结点恰被访问一次。
2.图的遍历方式:深度优先与广度优先
二、DFS与BFS的区别
1.概念
深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问止。
广度优先遍历可定义如下:假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先与“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
2. 路径
深度优先就是,从初始点出发,不断向前走,如果碰到死路了,就往回走一步,尝试另一条路,直到发现了目标位置。这种方法,即使成功也不一定找到一条好路,但是需要记住的位置比较少。
广度优先就是,从初始点出发,把所有可能的路径都走一遍,如果里面没有目标位置,则尝试把所有两步能够到的位置都走一遍,看有没有目标位置;如果还不行,则尝试所有三步可以到的位置。这种方法,一定可以找到一条最短路径,但需要记忆的内容实在很多,要量力而行。
3.算法实现
(1) 图的深度优先算法的一般性描述:
long DFS(图s,结点v。)
{ // 从结点v。出发,深度优先遍历图s,返回访问到的结点总数
int nNodes; //寄存访问到的结点数目
访问v。;
为v。置为已访问标志;
nNodes= 1;
求出v。的第1个可达邻接点v;
while (v存在)
{
if (v未被访问过) nNodes=nNodes+DFS(s,v);
求出v。的下个可达邻接点v;
}
return nNodes;
}
(2) 图的广度优先算法的一般性描述:
long BFS(图s, 结点v。)
{ // 在图s中从v。出发按广度优先遍历方式遍历s,返回遍历到的结点数目long nNodes=0;
初始化队列q;
if (v。存在)
{ v。入队列q;
置v。为已访问标志;
}
while (q不空)
{队列q的队头元素出队并送v;
访问v;
nNodes++; //对已访问元素计数
求出v的第一个可达邻接点w ;
while (w存在)
{
if (w尚未被访问过)
{
w入q;
置w为已访问标志;
}
求v的下个可达邻接点w;
}
return nNodes;
}
综上所述,广度优先和深度优先各有优劣之处。一般情况下,深度优先算法占内存少但速度较慢,广度优先算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解。深度优先与广度优先的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。由于其保留了所有的前继节点,所以在产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。这两种算法每次都扩展一个节点的所有子节点,而不同的是,深度优先下一次扩展的是本次扩展出来的子节点中的一个,而广度优先扩展的则是本次扩展的节点的兄弟点。在具体实现上为了提高效率,所以采用了不同的数据结构。因此在选择用哪种算法时,要综合考虑,使达到最优效果。