zoukankan      html  css  js  c++  java
  • 深度优先搜索和广度优先搜索

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

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

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

     

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

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

    深搜、广搜大概描述
     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 }




  • 相关阅读:
    家庭记账本1
    寒假福利5
    寒假福利4——定位功能
    寒假福利3——日期时间选择器
    寒假作业——家庭小账本1.6(总结)
    寒假作业——家庭小账本1.5
    寒假作业——家庭小账本1.4
    寒假作业——家庭小账本1.3
    寒假作业——家庭小账本1.2
    寒假作业——家庭小账本1.1
  • 原文地址:https://www.cnblogs.com/chenbin7/p/2198495.html
Copyright © 2011-2022 走看看