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 uV[G] faire
    • key[u]
    • π[u]NIL
  • key[r]0
  • QV[G]
  • tandis que Q faire // ... O(V)
    • u EXTRACT-MIN(u) // ... O(lgV)
      • pour chaque vadj[u] faire // ... O(E)
        • si vQ et w(u,v)>key[v]
          • puis π[v]u
            • keyw(u,v) // DECREASE-KEY ... O(lgV)

Le livre dit que la complexité totale est O(VlgV+ElgV)O(ElgV). Cependant, ce que j'ai compris, c'est que la forboucle intérieure avec l' DECREASE-KEYopération coûteraO(ElgV), 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(lgV+ElgV))=O(VlgV+EVlgV)O(EVlgV).

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)TEXTRACTMIN+Θ(E)TDECREASEKEY.

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

En utilisant un tas binaire, TEXTRACTMIN=O(logV),TDECREASEKEY=O(logV), la complexité est O(ElogV)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, TEXTRACTMIN=O(logV) amorti, TDECREASEKEY=O(1) amorti, la complexité est O(E+VlogV) au pire des cas.


1

Votre idée semble correcte. Prenons la complexité comme V(lgv+Elgv). 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(lgv+Vlgv), ce qui signifie Vlgv+V2lgv. Mais pour l'analyse du pire des cas (graphiques denses),V2 est à peu près égal au nombre d'arêtes, E, donnant Vlgv+Elgv=(V+E)lgv mais depuis VE, Par conséquent Elgv.


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.