zoukankan      html  css  js  c++  java
  • 深度优先与广度优先的区别

    这是我根据下面黑体字总结的:

    深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。

    广度优先搜索算法:保留全部结点,占用空间大;   无回溯操作(即无入栈、出栈操作),运行速度快。

    通常 深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。

    所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。  

     

    广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。

    但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快些

    下面用一些大概的代码来说明下:

    深搜、广搜大概描述
    /*
    广度优先搜索BFS
    
    visited[]数组作为标记,记录某一结点是否被访问过了;
    visit()函数用于访问该结点的具体信息
    Q代表队列,EnQueue(Q,v)表示结点v进入队列Q;DeQueue(Q,u)表示队列中删去头结点,赋给u
    FirstAdjvex(G,u)表示第一个邻接结点;NextAdjVex(G,v,w)表示v的下一个邻接结点(不是w)
    */
    BFS(Graph G,int v)
    {
        visited[v]=1;
        visit(v);
        EnQueue(Q,v);            //结点v入队列
        while(!QueueEmpty())     //当队列不为空
        {
            DeQueue(Q,u);        //队列首元素出列,赋给u
            for(w=FirstAdjvex(G,u);w>=0;w=NextAdjVex(G,u,w))        //循环遍历u的下一个邻接结点
            {
                if(!visited[w])
                {
                    visited[w]=1;
                    visit(w);
                }
                DeQueue(Q,w);
            }
        }
    }
    /*
    深度优先搜索DFS
    */
    DFS(Graph G,int v)
    {
        visit[v]=1;
        visit(v);
        for(w=FirstAdjvex(G,u);w>=0;w=NextAdjVex(G,u,w))
        {
            if(!visited[w])
                DFS(G,w);      //递归调用
        }
    }
    
    //因为可能是非连通图,故需要遍历所有结点
    //G.vexnum表示图中所有结点
    
    B/DFSTraverse(Graph G)
    {
        for(v=0;v<G.vexnum;v++)
            visited[v]=0;
        for(v=0;v<G.vexnum;v++)
            if(!visited[v])
                B/DFS(G,v);
    }
  • 相关阅读:
    关于C++中类的static和const成员
    你搞图论有毛用啊!!
    getopt()
    算法设计与分析求最大子段和问题(蛮力法、分治法、动态规划法) C++实现
    CF183 div2 解题报告
    程序员面试中什么最重要?
    php函数基础(一)
    可变参数列表
    ThinkPHP5+小程序商城 网盘视频
    svn里update以后还是有红色的感叹号怎么办
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3499492.html
Copyright © 2011-2022 走看看