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

132

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

Je pense donc que la complexité du temps serait:

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

vest le sommet 1àn

Premièrement, ce que j'ai dit est-il correct? Deuxièmement, comment est-ce O(N + E), et l'intuition de savoir pourquoi ce serait vraiment bien. Merci

ordinaire
la source

Réponses:

268

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

Mihai Maruseac
la source
1
Mais chaque sommet doit être extrait de la file d'attente, et c'est log (| Q |) Et cette partie?
Yola
3
log (| Q |) <log (N) <N donc vous pouvez ignorer en toute sécurité le terme dans l'asymptotique
Mihai Maruseac
2
Si dans une liste d'adjacence, chaque sommet est connecté à tous les autres sommets, la complexité serait équivalente à O (V + E) = O (V + V ^ 2) = O (V ^ 2). E = V ^ 2 car le plus grand nombre d'arêtes = V ^ 2.
Max
D'après votre réponse, la complexité ne deviendra-t-elle pas O (V + 2E)? Puisque chaque bord peut avoir un bord commun avec un autre bord?
karansky
2
Les termes constants peuvent être supprimés.
Mihai Maruseac
41

DFS (analyse):

  • La définition / l'obtention d'une étiquette de sommet / d'arête prend du O(1)temps
  • Chaque sommet est étiqueté deux fois
    • une fois comme INEXPLORÉ
    • une fois comme VISITE
  • Chaque arête est étiquetée deux fois
    • une fois comme INEXPLORÉ
    • une fois comme DISCOVERY ou BACK
  • La méthode incidentEdges est appelée une fois pour chaque sommet
  • DFS s'exécute dans le O(n + m)temps à condition que le graphique soit représenté par la structure de liste de contiguïté
  • Rappeler que Σv deg(v) = 2m

BFS (analyse):

  • La définition / l'obtention d'une étiquette de sommet / d'arête prend O (1) temps
  • Chaque sommet est étiqueté deux fois
    • une fois comme INEXPLORÉ
    • une fois comme VISITE
  • Chaque arête est étiquetée deux fois
    • une fois comme INEXPLORÉ
    • une fois comme DISCOVERY ou CROSS
  • Chaque sommet est inséré une fois dans une séquence Li
  • La méthode incidentEdges est appelée une fois pour chaque sommet
  • BFS s'exécute dans le O(n + m)temps à condition que le graphique soit représenté par la structure de liste de contiguïté
  • Rappeler que Σv deg(v) = 2m
Le nouveau
la source
tnx pour l'édition je suis nouveau ici donc j'essaye toujours de gérer avec l'écran d'édition :)
TheNewOne
1
merci d'être précis en mentionnant que les graphiques doivent être représentés par la structure de la liste de contiguïté, cela me dérangeait pourquoi DFS est O (n + m), je penserais que c'était O (n + 2m) car chaque arête est traversée deux fois en faisant marche arrière.
mib1413456
22

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.

Neetesh Dadwariya
la source
Beaucoup plus facile à comprendre que la notation mathématique sans autre explication, même si c'est à cela que sert Google.
mLstudent33
11

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 s'écrit O (n ^ 2).

Par conséquent, O (2E + V) s'écrit O (E + V)

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

Dhruvam Gupta
la source
@Am_I_Helpful quelqu'un demande ci-dessus 2E en notation big-oh .... c'est pourquoi 2 n'est pas considéré dans la complexité du temps.
Dhruvam Gupta
@Am_I_Helpful il suffit de voir le message au-dessus de ma réponse .... là, l'utilisateur nommé Kehe CAI a écrit "Je pense que chaque bord a été considéré deux fois et que chaque nœud a été visité une fois, donc la complexité temporelle totale devrait être O (2E + V ). " Alors j'ai répondu en accord ... J'ai compris !!!
Dhruvam Gupta
J'ai supprimé mon vote défavorable uniquement parce que vous avez modifié votre réponse,
Am_I_Helpful
3

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

Kehe CAI
la source
Même moi, je ressens la même chose. Quelqu'un peut-il donner plus d'explications à ce sujet?
Chaitanya
12
L'analyse Big O ignore la constante. O (2E + V) est O (E + V).
Hemm
3

Une explication intuitive à cela consiste simplement à analyser une seule boucle:

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

Ainsi, 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

For every V
=> 

    O(1)
    +

    O(e)

=> O(V) + O(E)
Ultrablendz
la source
2

Explication courte mais simple:

Dans le pire des cas, vous auriez besoin de visiter tous les sommets et arêtes, d'où la complexité temporelle dans le pire des cas est O (V + E)

CodeYogi
la source