深度优先与广度优先的区别
这是我根据下面黑体字总结的:
深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。
广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。
通常 深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。
所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。
广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。
但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快些
下面用一些大概的代码来说明下:
深搜、广搜大概描述 /* 广度优先搜索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); }