美文网首页
两种图的遍历算法

两种图的遍历算法

作者: 9bc96fd72f8e | 来源:发表于2016-10-01 13:52 被阅读2308次

在给出图的定义后第一个问题就是如何遍历图的所有顶点,有两种最基础的图遍历算法。如果给图添加更多的特征和属性,将产生更多关于图的算法,例如最短路径算法。

广度/深度优先搜索算法最早是解决迷宫问题时发现的。深度优先搜索算法(DFS)算法从图的任一顶点出发,尽量在回溯到源节点之前在每个分支上走的更远。DFS算法的复杂度为O(V+E),与图的大小成线性关系;空间复杂度上最坏情况是O(V),此时需要把图的全部顶点进栈BFS算法1950年被 Moore 发现,以寻找迷宫最短路径;BFSDFS算法的时空复杂度一致。

深度优先搜索算法

假设节点左枝干优先级大于右枝干,搜索从A开始,且假设搜索过程能记住先前访问的节点而不再重复访问它们,所以访问的顺序是ABDFECG.

11

DFS动画示例

DFS伪代码
Input: 图G和顶点v
Output: 生成树(spanning tree)
递归实现

procedure DFS(G,v){
    mark v as Reached;
    for(Vertex w:v.getAllVertexs(){
        if(w.isReached==false)
            recursively call DFS(G,w);
    }
}

非递归实现

procedure DFS(G,v){
    let S as a stack;
    S.push(v);
    while(S.isEmpty()==false){
        w = S.pop();
        if(w.isReached==false){
            mark v as Reached;
            for(Edges edge:v.getAllEdges(){
                S.push(w);
            }
        }
    }
}

递归和迭代方法的区别访问子节点顺序不同,导致最终生成树不同。前者是A, B, D, F, E, C, G,后者是A, E, F, B, D, C, G.

DFSBFS两种算法的区别在于:前者用栈,后者用队列来存储以访问过的节点;前者先出队再标记,后者先标记再出队。

广度优先搜索算法

22

BFS动画示例

伪代码
Input: 图G和顶点v
Output: 生成树(spanning tree)
广度优先搜索没有递归实现,只有非递归实现

BFS(Graph g,Vertex v){
    let Q as a queue;
    q.enqueue(v);
    while(q.isEmpty()==false){
        Vertex current = Q.dequeue();
        for(Vertex w:current.getAllVertexs()){
            if(w.isReached()==false)
                w.enqueue();
        }
    }
}

DFS区别在于
1.使用队列而非栈
2.监测节点是否已经访问并标记节点在入队前,而不是在入队后。

算法优劣

DFS的问题可以用下图说明

33
当查找C顶点时,DFS的搜索路径是a, b, d, e, f, g, h, j, l, m, k, i, c,其不合理是显而易见的。这意味着当经常被访问的资源挂在右节点上算法将有较大的性能浪费。不过这也说明,使用这种算法,重要的资源要挂在左边。

同时DFS深度优先搜索是一个P完全问题,意味着其无缘于并行计算。

参考文献

wiki/Depth-first_search
wiki/Breadth-first_search
www.kirupa.com/developer/depth_breadth_search7.htm
wiki/Shortest_path_problem
visualization/Algorithms.html

相关文章

  • 学习js数据结构与算法7—图

    图 图的遍历 两种算法可以对图进行遍历:==广度优先搜索和深度优先搜索== 当要标注已经访问过的顶点时,我们用三种...

  • 两种图的遍历算法

    在给出图的定义后第一个问题就是如何遍历图的所有顶点,有两种最基础的图遍历算法。如果给图添加更多的特征和属性,将产生...

  • 图的深度优先遍历和马踏棋盘算法

    图的深度优先遍历思想 图的遍历通常有两种遍历次序方案: 深度优先遍历和广度优先遍历。深度优先遍历(DepthFir...

  • 非递归求树的深度

    非递归求深度有两种算法:1,现将算法改成先序遍历,在改写成非递归方式。先序遍历遍历是:遍历一个节点前,先算出当前节...

  • 基本数据结构

    一.图二.树 一.图 1.图的遍历: 通过深度优先遍历DFS和广度优先遍历BFS两种方式。深度优先遍历0 1 2 ...

  • 树的遍历

    算法需要通过函数来体现.树型结构的遍历是算法的顶峰. 虽然还有更复杂的图的结构,但是图的遍历存在不确定性,不够严谨...

  • DFS(深搜)算法

    深度优先搜索算法(Depth-First-Search):是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的...

  • 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策...

  • 数据结构-图

    邻接矩阵中的两个最短路径算法,Djkstra,Floyd 以邻接表存储的两种遍历,深度优先遍历和广度优先遍历,类比...

  • 图的存储与遍历

    图的存储与遍历 一.实验目的 掌握图的存储结构以及图的深度优先搜索遍历、最小生成树算法。 二.实验要求与内容 自构...

网友评论

      本文标题:两种图的遍历算法

      本文链接:https://www.haomeiwen.com/subject/eqbryttx.html