深度优先与广度优先的区别

 

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

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

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

 

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

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

 

 

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

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

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

 

深搜、广搜大概描述
/*
广度优先搜索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);
}

 

posted @ 2013-12-31 15:14  博园少主  阅读(2837)  评论(0编辑  收藏  举报