BFS算法的实验范例(java)
2018-02-05 17:25
363 查看
最近一直都在学习BFS算法,故作此来梳理一下。
首先先介绍一下BFS,BFS(Breadth-first-search)广度优先搜索,又称为宽度优先搜索,是图的搜索算法之一。与深度优先搜索不同的是,广度优先搜索会先搜索到与起始点距离比较近的点,而深搜却是沿着一个分支递归到最后。
系统的扯一下~
给定图G和一个原点s,按照由近及远的顺序,BFS遍历逐层访问s可达的所有节点,并计算从s到各节点的距离(即s至各节点的路径上的边数),其中s至节点v的距离值:(v∈V)
1.当s与v间不连通时,d[v]=-1
2.当s与v间连通时,d[v]=s与v间的最短路长
初始的时候,d[s]=0,其他节点的d值为-1,广度优先遍历过程如下:
顺序处理每个已访问的节点u:遍历访问所有与u邻接的未访问的节点v((u,v)∈E,d[v]==-1)。由于u是v的父亲或者前驱,因此v的距离值d[v]=d[u]+1。(划重点,+1的原因)
由于是按照层次进行的,且通过“先进先出”的原则来实现,此时可以使用队列(下篇博文会提及到)。拟定一个队列Q,按照先后顺序存储被访问过的节点,步骤如下:
1.首先源点s入队列Q,d[s]=0;
2.然后依次访问所有与s相邻的未被访问过的节点v((u,v)∈E,d[v]==-1),d[v]=d[s]+1=1,并将v加入队列Q中;
3.接下来按照先进先出的原则来扩展队首的节点,每扩展一个队首节点u,节点u出队列,所有与u相邻的未被访问的节点v((u,v)∈E,d[v]==-1)入队列Q其距离值为d[v]=d[u]+1;
4.依次类推,直至队列Q为空。
BFS遍历从源点s出发,由近及远,依次访问和s有路径相连且路长为1,2,3.....的节点,最终形成一颗以s为根的BFS遍历树。
其算法如下:
s int w;
处理节点; d[v]=0;//置节点v的距离值 addQ(Q,v);//v进入队列Q while(!emptyQ(Q)){//若不为空,则循环 v=delQ(Q);//出队 取v的第1个邻接点w;//若v无邻接点,则w=-1 while(w!=-1){//反复搜索未访问的邻接点 if(d[w]==-1){//若没有访问
处理邻接点w; addQ(Q,w);//邻接点w入队 d[w]=d[v]+1;//计算邻接点w的距离值 } 取v的下一个邻接点w; } } }
BFS与DFS相比较:
深度优先搜索用栈(stack)来实现:
1. 把起始顶点压入栈中。
2. 每次从栈顶取出一个顶点,搜索所有它的未访问相邻顶点,把这些顶点压入栈中。
3. 重复执行第二步操作,直至找到所要找的顶点或者栈为空时结束程序。
广度优先搜索使用队列(queue)来实现:
1. 把起始顶点放到队列中。
2. 每次从队首取出一个顶点,查看这个顶点所有的未访问相邻顶点,把它们放到队尾。
3. 重复执行第二步操作,直至找到所要找的顶点或者队列为空时结束程序。
参考书籍:吴永辉老师,王建德老师,数据结构编程实验第二版 机械工业出版社
首先先介绍一下BFS,BFS(Breadth-first-search)广度优先搜索,又称为宽度优先搜索,是图的搜索算法之一。与深度优先搜索不同的是,广度优先搜索会先搜索到与起始点距离比较近的点,而深搜却是沿着一个分支递归到最后。
系统的扯一下~
给定图G和一个原点s,按照由近及远的顺序,BFS遍历逐层访问s可达的所有节点,并计算从s到各节点的距离(即s至各节点的路径上的边数),其中s至节点v的距离值:(v∈V)
1.当s与v间不连通时,d[v]=-1
2.当s与v间连通时,d[v]=s与v间的最短路长
初始的时候,d[s]=0,其他节点的d值为-1,广度优先遍历过程如下:
顺序处理每个已访问的节点u:遍历访问所有与u邻接的未访问的节点v((u,v)∈E,d[v]==-1)。由于u是v的父亲或者前驱,因此v的距离值d[v]=d[u]+1。(划重点,+1的原因)
由于是按照层次进行的,且通过“先进先出”的原则来实现,此时可以使用队列(下篇博文会提及到)。拟定一个队列Q,按照先后顺序存储被访问过的节点,步骤如下:
1.首先源点s入队列Q,d[s]=0;
2.然后依次访问所有与s相邻的未被访问过的节点v((u,v)∈E,d[v]==-1),d[v]=d[s]+1=1,并将v加入队列Q中;
3.接下来按照先进先出的原则来扩展队首的节点,每扩展一个队首节点u,节点u出队列,所有与u相邻的未被访问的节点v((u,v)∈E,d[v]==-1)入队列Q其距离值为d[v]=d[u]+1;
4.依次类推,直至队列Q为空。
BFS遍历从源点s出发,由近及远,依次访问和s有路径相连且路长为1,2,3.....的节点,最终形成一颗以s为根的BFS遍历树。
其算法如下:
void bfs(vlink g[],int v){
s int w;
处理节点; d[v]=0;//置节点v的距离值 addQ(Q,v);//v进入队列Q while(!emptyQ(Q)){//若不为空,则循环 v=delQ(Q);//出队 取v的第1个邻接点w;//若v无邻接点,则w=-1 while(w!=-1){//反复搜索未访问的邻接点 if(d[w]==-1){//若没有访问
处理邻接点w; addQ(Q,w);//邻接点w入队 d[w]=d[v]+1;//计算邻接点w的距离值 } 取v的下一个邻接点w; } } }
BFS与DFS相比较:
深度优先搜索用栈(stack)来实现:
1. 把起始顶点压入栈中。
2. 每次从栈顶取出一个顶点,搜索所有它的未访问相邻顶点,把这些顶点压入栈中。
3. 重复执行第二步操作,直至找到所要找的顶点或者栈为空时结束程序。
广度优先搜索使用队列(queue)来实现:
1. 把起始顶点放到队列中。
2. 每次从队首取出一个顶点,查看这个顶点所有的未访问相邻顶点,把它们放到队尾。
3. 重复执行第二步操作,直至找到所要找的顶点或者队列为空时结束程序。
参考书籍:吴永辉老师,王建德老师,数据结构编程实验第二版 机械工业出版社
相关文章推荐
- Java基础知识之典型范例二
- java1.12.3实验3(从键盘输入数据)Scanner工具类
- 【java】动态代理2(含范例)
- java实验2
- java实验二
- 20145322第一次JAVA实验报告
- 实验三 继承,上转型对象 之 HardWork.java
- 20145316《Java程序设计》实验一:Java开发环境的熟悉(Windows + IDEA)
- Java实验(5) 最大子方阵
- 20145207《Java程序设计》实验一(Java开发环境的熟悉)实验报告
- 大二上java结课实验:模仿炸弹人的小游戏
- Java实验--字体设计
- Java实验报告(实验五)
- flex 和java 一起开发.实验远程调用.
- 《通过实验看 Java 中私有成员是否能被继承》续
- 山东大学模式识别实验(java)贝叶斯算法
- 范例解说Java里的线程概念与线程同步技术
- JAVA--第五周实验--任务1--封装一类三角形对象Triangle,并实现一些求周长求面积的功能。
- 创建文件夹和文件的java代码范例
- [SIR数据集实验][2]Java类数据集相应工具使用的小经验