深度优先搜索和广度优先搜索

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

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

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

 

通常深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。
  广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快些

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

深搜、广搜大概描述
 1 /*
2 广度优先搜索BFS
3
4 visited[]数组作为标记,记录某一结点是否被访问过了;
5 visit()函数用于访问该结点的具体信息
6 Q代表队列,EnQueue(Q,v)表示结点v进入队列Q;DeQueue(Q,u)表示队列中删去头结点,赋给u
7 FirstAdjvex(G,u)表示第一个邻接结点;NextAdjVex(G,v,w)表示v的下一个邻接结点(不是w)
8 */
9 BFS(Graph G,int v)
10 {
11 visited[v]=1;
12 visit(v);
13 EnQueue(Q,v); //结点v入队列
14 while(!QueueEmpty()) //当队列不为空
15 {
16 DeQueue(Q,u); //队列首元素出列,赋给u
17 for(w=FirstAdjvex(G,u);w>=0;w=NextAdjVex(G,u,w)) //循环遍历u的下一个邻接结点
18 {
19 if(!visited[w])
20 {
21 visited[w]=1;
22 visit(w);
23 }
24 DeQueue(Q,w);
25 }
26 }
27 }
28 /*
29 深度优先搜索DFS
30 */
31 DFS(Graph G,int v)
32 {
33 visit[v]=1;
34 visit(v);
35 for(w=FirstAdjvex(G,u);w>=0;w=NextAdjVex(G,u,w))
36 {
37 if(!visited[w])
38 DFS(G,w); //递归调用
39 }
40 }
41
42 //因为可能是非连通图,故需要遍历所有结点
43 //G.vexnum表示图中所有结点
44
45 B/DFSTraverse(Graph G)
46 {
47 for(v=0;v<G.vexnum;v++)
48 visited[v]=0;
49 for(v=0;v<G.vexnum;v++)
50 if(!visited[v])
51 B/DFS(G,v);
52 }




原文地址:https://www.cnblogs.com/chenbin7/p/2198495.html