zoukankan      html  css  js  c++  java
  • 算法分析---------------------BFS算法

     

    广度优先算法(转)http://blog.csdn.net/furturerock/article/details/5568305


     

    空间复杂度

    因为所有节点都必须被储存,因此BFS的空间复杂度为 O(|V| + |E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。注:另一种说法称BFS的空间复杂度为 O(BM),其中 B 是最大分支系数,而 M 是树的最长路径长度。由于对空间的大量需求,因此BFS并不适合解非常大的问题。

    时间复杂度

    最差情形下,BFS必须寻找所有到可能节点的所有路径,因此其时间复杂度为 O(|V| + |E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。

    若所有边的长度相等,广度优先搜索算法是最佳解——亦即它找到的第一个解,距离根节点的边数目一定最少;但对一般的图来说,BFS并不一定回传最佳解。这是因为当图形为加权图(亦即各边长度不同)时,BFS仍然回传从根节点开始,经过边数目最少的解;而这个解距离根节点的距离不一定最短。


    广度优先搜索,即BFS(Breadth First Search),是一种相当常用的图算法,其特点是:每次搜索指定点,并将其所有未访问过的邻近节点加入搜索队列,循环搜索过程直到队列为空。

            算法描述如下:

            (1)将起始节点放入队列尾部

             (2)While(队列不为空)

    取得删除队列首节点Node

                              处理该节点Node

                              把Node的未处理相邻节点加入队列尾部

             使用该算法注意的问题:

            (1)使用该算法关键的数据结构为:队列,队列保证了广度渡优先,并且每个节点都被处理到

             (2)新加入的节点一般要是未处理过的,所以某些情况下最初要对所有节点进行标记

             (3)广度优先在实际使用时,很对情况已超出图论的范围,将新节点加入队列的条件不再局限于

    相邻节点这个概念。例如,使用广度优先的网络爬虫在抓取网页时,会把一个链接指向的网页中的所有

    URL加入队列供后续处理。


    /*
     * main.cpp
     *
     *  Created on: 2013-8-20
     *    Author: 白强
     */
    //根据别人的源码自己加以修改
    ///////////////////////////////
    //广度优先之节点遍历
    //1-----5----------9
    //|
    //|
    //2-----4----6-----8
    //|
    //|
    //3-------7-------10
    //  1 2 3 4 5 6 7 8
    //1 0 1 0 0 1 0 0 0
    //2 1 0 1 1 0 0 0 0
    //3 0 1 0 0 0 0 1 0
    //4 0 1 0 0 1 1 0 0
    //5 1 0 0 1 0 0 0 0
    //6 0 0 0 1 0 0 1 1
    //7 0 0 1 0 0 1 0 0
    //8 0 0 0 0 0 1 0 0
    
    #include <iostream>
    #include <queue>
    using namespace std;
    
    //节点数
    #define M 10
    
    //图的矩阵表示
    int matrix[M][M] = { 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
            0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1,
            0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
            0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
            0, 0, 0, 0, 1, 1, 0, 0 };
    //访问标记,初始化为0,
    int visited[M + 1];
    
    //graph traverse
    void GT_BFS() {
        visited[1] = 1;
        queue<int> q;
        q.push(1);
        while (!q.empty()) {
            int top = q.front();
            cout << top << " "; //输出
            q.pop();
            int i;
            for (i = 1; i <= M; ++i) {
                if (visited[i] == 0 && matrix[top - 1][i - 1] == 1) {
                    visited[i] = 1;
                    q.push(i);
                }
            }
        }
    }
    
    int main() {
        GT_BFS(); //输出结果为1 2 5 3 4 9 7 6 8 10
        return 0;
    }

  • 相关阅读:
    三类设计模式UML图
    有一种面试叫-----别人的面试
    reference to 'map' is ambiguous|
    多个if语句和else if区别
    n&m位运算
    边缘填充算法
    C# 换行
    优秀程序员必须知道的32个算法,提高你的开发效率
    作业四(不算寒假了吧)
    寒假作业三
  • 原文地址:https://www.cnblogs.com/bq12345/p/3270769.html
Copyright © 2011-2022 走看看