Pourquoi la complexité temporelle des deux DFS et BFS O (V + E)

L'algorithme de base pour 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

Donc je pense que la complexité temporelle serait:

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

v est le sommet 1 à n

Tout d'abord, ce que j'ai dit est-il correct? Deuxièmement, comment est-ce O(N + E), et l'intuition pourquoi serait vraiment sympa. Merci

99
demandé sur rd22 2012-07-13 14:24:33

7 réponses

Votre somme

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

Peut être réécrit comme

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

Et le premier groupe est O(N) tandis que l'autre est O(E).

215
répondu Mihai Maruseac 2016-01-26 03:19:29

DFS (analyse):

  • définir/obtenir une étiquette de sommet/bord prend O(1) Temps
  • chaque sommet est étiqueté deux fois
    • Une fois inexploré
    • Une fois visité
  • chaque bord est étiqueté deux fois
    • Une fois inexploré
    • Une fois comme découverte ou retour
  • la méthode incidentEdges est appelée une fois pour chaque sommet
  • DFS s'exécute dans O(n + m) temps à condition que le graphique soit représenté par la liste de contiguïté structure
  • rappelez-vous que Σv deg(v) = 2m

BFS (analyse):

  • définir/obtenir une étiquette de sommet/bord prend O (1) Temps
  • chaque sommet est étiqueté deux fois
    • Une fois inexploré
    • Une fois visité
  • chaque bord est étiqueté deux fois
    • Une fois inexploré
    • Une fois comme découverte ou croix
  • Chaque sommet est inséré une fois dans une séquence Li
  • la méthode incidentEdges est appelée une fois pour chaque vertex
  • BFS s'exécute dans O(n + m) temps à condition que le graphique soit représenté par la structure de liste d'adjacence
  • rappelez-vous que Σv deg(v) = 2m
35
répondu TheNewOne 2012-07-13 10:33:04

Très simplifié sans trop de formalité: chaque arête est considérée exactement deux fois, et chaque nœud est traité exactement une fois, donc la complexité doit être un multiple constant du nombre d'arêtes ainsi que du nombre de Sommets.

18
répondu JavaFreak 2015-07-18 09:42:21

La complexité temporelle est O(E+V) au lieu de O(2E+V) parce que si la complexité temporelle est n^2 + 2n + 7 alors elle est écrite comme O (n^2).

Par conséquent, O (2E+V) est écrit comme O (E+V)

Parce que la différence entre N ^ 2 et n importe mais pas entre n et 2n.

8
répondu Dhruvam Gupta 2015-09-12 11:30:42

Je pense que chaque arête a été considérée deux fois et que chaque nœud a été visité une fois, donc la complexité totale du temps devrait être O (2E+V).

3
répondu Kehe CAI 2015-07-21 08:23:36

Explication courte mais simple:

Je le pire des cas, vous auriez besoin de visiter tout le sommet et le bord par conséquent la complexité temporelle dans le pire des cas est O (V + E)

1
répondu CodeYogi 2016-07-27 04:17:21

Une explication intuitive à ceci est en analysant simplement une seule boucle:

  1. visitez un sommet - > O (1)
  2. une boucle for sur tous les arêtes incidentes - > O(e) où e est un nombre d'arêtes incidentes sur un sommet donné v.

Donc le temps total pour une seule boucle est O (1)+O (e). Maintenant, additionnez-le pour chaque sommet car chaque sommet est visité une fois. Cela donne

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)]

0
répondu Ultrablendz 2017-08-07 09:27:56