为什么DFS和BFS O(V + E)的时间复杂度

时间:2012-07-13 10:24:34

标签: algorithm time-complexity graph-theory breadth-first-search

BFS的基本算法:

set start vertex to visited

load it into queue

while queue not empty

   for each edge incident to vertex

        if its not visited

            load into queue

            mark vertex

所以我认为时间的复杂性将是:

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges) 

其中v是顶点1n

首先,我说的是正确的吗?其次,这个O(N + E)怎么样,直觉为什么会非常好。感谢

7 个答案:

答案 0 :(得分:237)

你的总和

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)

可以改写为

(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]

,第一组为O(N),而另一组为O(E)

答案 1 :(得分:36)

DFS(分析):

  • 设置/获取顶点/边缘标签需要O(1)时间
  • 每个顶点都标记两次
    • 曾作为UNEXPLORED
    • 曾作为VISITED
  • 每条边都标记两次
    • 曾作为UNEXPLORED
    • 一次作为DISCOVERY或BACK
  • 方法eventsEdges为每个顶点调用一次
  • 如果图表由邻接列表结构
  • 表示,则DFS在O(n + m)时间内运行
  • 回想一下Σv deg(v) = 2m

BFS(分析):

  • 设置/获取顶点/边缘标签需要O(1)时间
  • 每个顶点都标记两次
    • 曾作为UNEXPLORED
    • 曾作为VISITED
  • 每条边都标记两次
    • 曾作为UNEXPLORED
    • 一次发现或交叉
  • 每个顶点都插入一个序列Li
  • 方法eventsEdges为每个顶点调用一次
  • 如果图表由邻接列表结构
  • 表示,则BFS在O(n + m)时间内运行
  • 回想一下Σv deg(v) = 2m

答案 2 :(得分:18)

非常简化而没有太多形式:每个边都被认为是两次,每个节点只处理一次,因此复杂度必须是边数和顶点数的常数倍。

答案 3 :(得分:3)

我认为每个边缘都被考虑过两次,每个节点都被访问过一次,因此总时间复杂度应为O(2E + V)。

答案 4 :(得分:2)

简短而简单的解释:

  

我最糟糕的情况是你需要访问所有的顶点和边缘   最坏情况下的时间复杂度为O(V + E)

答案 5 :(得分:2)

对此的直观解释是简单地分析单个循环:

  1. 访问顶点 - > O(1)
  2. 所有事件边缘的for循环 - > O(e)其中e是入射在给定顶点v上的多个边缘。
  3. 因此单个循环的总时间为O(1)+ O(e)。现在,每个顶点访问一次,为每个顶点求和。这给了

      

    Sigma_i

    p {
        height: 50px;
        line-height: 50px;
    }
    
    span {
        position: relative;
        font-size: 2.5em;
        display: inline-block;
        line-height: .7em;
        vertical-align: middle;
    }
    
    span:before {
        font-size: 12px;
        display: block;
        position absolute;
        left: 0;
        top: 0;
        content: "V";
        width: 22px;
        text-align: center;
    }
    
    span:after {
        font-size: 12px;
        display: block;
        position absolute;
        left: 0;
        bottom: 0;
        content: "k = 1";
        width: 27px;
        text-align: center;
    }
    <p>
        <span>&Sigma;</span>
        O(1) + O(e)
    => 
        <span>&Sigma;</span>
        O(1)
        +
       <span>&Sigma;</span>
        O(e)
    
    => O(V) + O(E)
    
    </p>

    [O(1)+ O(e)]

答案 6 :(得分:0)

是O(V + E),因为每次访问V的v必须访问E的每个e,其中| e | <= V-1。由于有V个访问V的v,所以就是O(V)。现在您必须添加V * | e | = E => O(E)。因此,总时间复杂度为O(V + E)。