MST: complexité de l'algorithme de Prim, pourquoi pas


8

Selon CLRS, les algorithmes de Prim sont implémentés comme ci-dessous -

MST-PRIM(G,w,r)

  • pour chaque u∈V[G] faire
    • key[u]←∞
    • π[u]←NIL
  • key[r]←0
  • Q←V[G]
  • tandis que Q≠∅ faire // ... O(V)
    • u ← EXTRACT-MIN(u) // ... O(lg⁡V)
      • pour chaque v∈adj[u] faire // ... O(E)
        • si v∈Q et w(u,v)>key[v]
          • puis π[v]←u
            • key←w(u,v) // DECREASE-KEY ... O(lg⁡V)

Le livre dit que la complexité totale est O(Vlg⁡V+Elg⁡V)≈O(Elg⁡V). Cependant, ce que j'ai compris, c'est que la forboucle intérieure avec l' DECREASE-KEYopération coûteraO(Elg⁡V), et la whileboucle extérieure renferme à la fois la boucle EXTRACT-MINintérieure et la forboucle intérieure , de sorte que la complexité totale doit êtreO(V(lg⁡V+Elg⁡V))=O(Vlg⁡V+EVlg⁡V)≈O(EVlg⁡V).

Pourquoi l'analyse de complexité n'est pas effectuée en tant que telle? et Quel est le problème avec ma formulation?

Réponses:


9

La complexité est dérivée comme suit. La phase d'initialisation coûteO(V). lewhile la boucle est exécutée |V|fois. lefor boucle imbriquée dans le while la boucle est exécutée degree(u)fois. Enfin, le lemme de prise de contact implique qu'il existeΘ(E)DECREASE-KEY implicites. Par conséquent, la complexité est:Θ(V)∗TEXTRACT−MIN+Θ(E)∗TDECREASE−KEY.

La complexité réelle dépend de la structure de données réellement utilisée dans l'algorithme. En utilisant un tableau,TEXTRACT−MIN=O(V),TDECREASE−KEY=O(1), la complexité est O(V2) au pire des cas.

En utilisant un tas binaire, TEXTRACT−MIN=O(log⁡V),TDECREASE−KEY=O(log⁡V), la complexité est O(Elog⁡V)au pire des cas. Voici pourquoi: puisque le graphe est connecté, alors|E|≥|V|−1, et E est tout au plus V2(pire cas, pour un graphique dense). Vous avez probablement manqué ce point.

À l'aide d'un tas de Fibonacci, TEXTRACT−MIN=O(log⁡V) amorti, TDECREASE−KEY=O(1) amorti, la complexité est O(E+Vlog⁡V) au pire des cas.


1

Votre idée semble correcte. Prenons la complexité comme V(lg⁡v+Elg⁡v). Ensuite, notez que dans la boucle for interne, nous traversons en fait tous les sommets, et non les bords, alors modifions un peu pour V(lg⁡v+Vlg⁡v), ce qui signifie Vlg⁡v+V2lg⁡v. Mais pour l'analyse du pire des cas (graphiques denses),V2 est à peu près égal au nombre d'arêtes, E, donnant Vlg⁡v+Elg⁡v=(V+E)lg⁡v mais depuis V≪E, Par conséquent Elg⁡v.


Qu'est-ce que v? Une faute de frappe pourV?
— David Richerby

En fait, je ne comprends pas du tout cela. Que signifie dire "Prenons la complexité comme [expression 1]" et ensuite "modifions un peu en [expression 2]"? Vous ne pouvez pas simplement supposer que le temps de fonctionnement est une chose, puis le changer pour autre chose.
— David Richerby
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.