广度优先搜索(BFS)思路及算法分析
2019-05-12 12:12
901 查看
1、算法用途:
是一种图像搜索演算法。用于遍历图中的节点,有些类似于树的深度优先遍历。这里唯一的问题是,与树不同,图形可能包含循环,因此我们可能会再次来到同一节点。
2、主要思想:
主要借助一个队列、一个布尔类型数组、邻接矩阵完成(判断一个点是否查看过,用于避免重复到达同一个点,造成死循环等),先将各点以及各点的关系存入邻接矩阵。
再从第一个点开始,将一个点存入队列,然后在邻接表中找到他的相邻点,存入队列,每次pop出队列头部并将其打印出来(文字有些抽象,实际过程很简单),整个过程有点像往水中投入石子水花散开。
(邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集)
3、代码(java):
(以上图为例的代码)
import java.util.*; //This class represents a directed graph using adjacency list //representation class Graph1 { private static int V; // No. of vertices private LinkedList<Integer> adj[]; // Adjacency Lists // Constructor Graph1(int v) { V = v; adj = new LinkedList[v]; for (int i = 0; i < v; ++i) adj[i] = new LinkedList(); } // Function to add an edge into the graph void addEdge(int v, int w) { adj[v].add(w); } // prints BFS traversal from a given source s public void BFS() { // Mark all the vertices as not visited(By default // set as false) boolean visited[] = new boolean[V]; // Create a queue for BFS LinkedList<Integer> queue = new LinkedList<Integer>(); for (int i = 0; i < V; i++) { if (!visited[i]) { BFSUtil(i, visited, queue); } } } public void BFSUtil(int s, boolean visited[], LinkedList<Integer> queue) { // Mark the current node as visited and enqueue it visited[s] = true; queue.add(s); while (queue.size() != 0) { // Dequeue a vertex from queue and print it s = queue.poll(); System.out.print(s + " "); // Get all adjacent vertices of the dequeued vertex s // If a adjacent has not been visited, then mark it // visited and enqueue it Iterator<Integer> i = adj[s].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited ) { visited = true; queue.add(n); } } } } // Driver method to public static void main(String args[]) { Graph1 g = new Graph1(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); System.out.println("Following is Breadth First Traversal " + "(starting from vertex 2)"); g.BFS(); } }
4、复杂度分析:
算法借助了一个邻接表和队列,故它的空问复杂度为O(V)。 遍历图的过程实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用结构。 邻接表表示时,查找所有顶点的邻接点所需时间为O(E),访问顶点的邻接点所花时间为O(V),此时,总的时间复杂度为O(V+E)。
相关文章推荐
- 【算法设计与分析】基本思路
- “计算机算法设计与分析”期末考点以及应试思路-D_Dan
- 【常用算法思路分析系列】链表相关高频题集
- 算法系列—广度优先搜索(BFS)
- 【算法笔记】bfs广度优先搜索
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 【常用算法思路分析系列】与二分搜索相关高频题
- 【算法】广度优先搜索(BFS)I
- 大数据分析建模思路技巧和算法的特征
- 【算法——02】图的遍历——BFS广度优先搜索、DFS深度优先搜索
- 算法的分析思路
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
- 一个文本情感识别与舆情分析的算法设计思路
- 【常用算法思路分析系列】字符串高频题集
- 【算法分析与设计】广度优先搜索
- 算法导论-第22章-基本的图算法-22.2 广度优先搜索(BFS)
- 无权最短路径BFS(广度优先搜索)算法(图论)
- 含重复字符的字符串全排列算法(思路+分析)
- 算法: 无向图的深度优先搜索(dfs)和广度优先搜索(bfs)
- POJ 3026 Borg Maze 图论 prim算法(最小生成树)+BFS算法(广度优先搜索)