• 算法分析---------------------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;
    }

  • 相关阅读:
    797. 所有可能的路径
    1286. 字母组合迭代器
    216. 组合总和 III
    77. 组合
    784. 字母大小写全排列
    90. 子集 II
    78. 子集
    47. 全排列 II
    46. 全排列
    40. 组合总和 II
  • 原文地址:https://www.cnblogs.com/bq12345/p/3270769.html
Copyright © 2020-2023  润新知