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?

ramgorur
la source

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.

Massimo Cafaro
la source
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.

user3473400
la source
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