首页
登录 | 注册

广度优先搜索(BFS)思路及算法分析

BFS

1、算法用途:

是一种图像搜索演算法。用于遍历图中的节点,有些类似于树的深度优先遍历。这里唯一的问题是,与树不同,图形可能包含循环,因此我们可能会再次来到同一节点。

 

2、主要思想:

主要借助一个队列、一个布尔类型数组、邻接矩阵完成(判断一个点是否查看过,用于避免重复到达同一个点,造成死循环等),先将各点以及各点的关系存入邻接矩阵。

再从第一个点开始,将一个点存入队列,然后在邻接表中找到他的相邻点,存入队列,每次pop出队列头部并将其打印出来(文字有些抽象,实际过程很简单),整个过程有点像往水中投入石子水花散开。

广度优先搜索(BFS)思路及算法分析

 

广度优先搜索(BFS)思路及算法分析

(邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集)

3、代码(java):

广度优先搜索(BFS)思路及算法分析

(以上图为例的代码)

 1 import java.util.*;
 2 
 3 //This class represents a directed graph using adjacency list 
 4 //representation 
 5 class Graph1 {
 6     private static int V; // No. of vertices
 7     private LinkedList<Integer> adj[]; // Adjacency Lists
 8 
 9     // Constructor
10     Graph1(int v) {
11         V = v;
12         adj = new LinkedList[v];
13         for (int i = 0; i < v; ++i)
14             adj[i] = new LinkedList();
15     }
16 
17     // Function to add an edge into the graph
18     void addEdge(int v, int w) {
19         adj[v].add(w);
20     }
21 
22     // prints BFS traversal from a given source s
23     public void BFS() {
24         // Mark all the vertices as not visited(By default
25         // set as false)
26         boolean visited[] = new boolean[V];
27         // Create a queue for BFS
28         LinkedList<Integer> queue = new LinkedList<Integer>();
29 
30         for (int i = 0; i < V; i++) {
31             if (!visited[i]) {
32                 BFSUtil(i, visited, queue);
33             }
34         }
35     }
36 
37     public void BFSUtil(int s, boolean visited[], LinkedList<Integer> queue) {
38         // Mark the current node as visited and enqueue it
39         visited[s] = true;
40         queue.add(s);
41 
42         while (queue.size() != 0) {
43             // Dequeue a vertex from queue and print it
44             s = queue.poll();
45             System.out.print(s + " ");
46 
47             // Get all adjacent vertices of the dequeued vertex s
48             // If a adjacent has not been visited, then mark it
49             // visited and enqueue it
50             Iterator<Integer> i = adj[s].listIterator();
51             while (i.hasNext()) {
52                 int n = i.next();
53                 if (!visited[n]) {
54                     visited[n] = true;
55                     queue.add(n);
56                 }
57             }
58         }
59     }
60 
61     // Driver method to
62     public static void main(String args[]) {
63         Graph1 g = new Graph1(4);
64 
65         g.addEdge(0, 1);
66         g.addEdge(0, 2);
67         g.addEdge(1, 2);
68         g.addEdge(2, 0);
69         g.addEdge(2, 3);
70         g.addEdge(3, 3);
71 
72         System.out.println("Following is Breadth First Traversal " + "(starting from vertex 2)");
73         g.BFS();
74     }
75 }

 

4、复杂度分析:

算法借助了一个邻接表和队列,故它的空问复杂度为O(V)。 遍历图的过程实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用结构。 邻接表表示时,查找所有顶点的邻接点所需时间为O(E),访问顶点的邻接点所花时间为O(V),此时,总的时间复杂度为O(V+E)。


相关文章

  • Android6.0 源码修改之 Contacts应用
    一.Contacts应用的主界面和联系人详情界面增加顶部菜单添加退出按钮 通过Hierarchy View 工具可以发现 主界面对应的类为 PeopleActivity 联系人详情界面对应的类为 QuickContactActivity 左 ...
  • 1 最有影响力的30篇计算机视觉会议论文 选取论文的原则: (1)会议论文,主要来源于以下会议:CVPR, ICCV, ECCV, BMVC, FG, ICIP, ICPR, WACV, ICASSP, MM, IJCAI, UAI, AA ...
  • python接口自动化(二十一)--unittest简介(详解)
    简介 前边的随笔主要介绍的requests模块的有关知识个内容,接下来看一下python的单元测试框架unittest.熟悉 或者了解java 的小伙伴应该都清楚常见的单元测试框架 Junit 和 TestNG,这个招聘的需求上也是经常见到 ...
  • 页面性能优化-原生JS实现图片懒加载
         在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的 ...
  • LSTM实现中文文本情感分析
    1. 背景介绍 文本情感分析是在文本分析领域的典型任务,实用价值很高.本模型是第一个上手实现的深度学习模型,目的是对深度学习做一个初步的了解,并入门深度学习在文本分析领域的应用.在进行模型的上手实现之前,已学习了吴恩达的机器学习和深度学习的 ...
  • 目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { public static void ...

2019 cecdns.com webmaster#cecdns.com
12 q. 0.079 s.
京ICP备10005923号