zoukankan      html  css  js  c++  java
  • 广度优先搜索(BFS)思路及算法分析

    1、算法用途:

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

    2、主要思想:

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

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

     

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

    3、代码(java):

    (以上图为例的代码)

     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)。

  • 相关阅读:
    创建并发布npm包
    ubuntu下python+tornado+supervisor+nginx部署
    Ubuntu下pycharm设定任务栏图标后打开出现问号图标
    Ubuntu下安装keras
    Windows和Ubuntu双系统
    Java获取精确到秒的时间戳
    Jmeter Java请求
    git 生成公钥、私钥方法与clone使用方法
    Oracle 安全管理
    五、python沉淀之路--字典
  • 原文地址:https://www.cnblogs.com/Unicron/p/10850236.html
Copyright © 2011-2022 走看看