MST: Prims Algorithmuskomplexität, warum nicht


8

Laut CLRS sind die Algorithmen des Prim wie folgt implementiert:

MST-PRIM(G,w,r)

  • für jedes tunu∈V[G]
    • Schlüssel[u]]←∞
    • π[u]]←NULL
  • Schlüssel[r]]←0
  • Q.←V.[G]]
  • während Q.≠∅ tun // ... Ö(V.)
    • u ← EXTRACT-MIN(u) // ...O(lg⁡V)
      • für jedes v∈adj[u] mache // ... O(E)
        • wenn v∈Q und w(u,v)>key[v]
          • dann π[v]←u
            • // TASTE VERRINGERN ... O ( lg V )key←w(u,v)DECREASE-KEYO(lg⁡V)

Das Buch sagt, dass die Gesamtkomplexität . Was ich jedoch verstanden habe, ist, dass die innere Schleife mit der Operation O ( E lg V ) kostet und die äußere Schleife sowohl die als auch die innere Schleife einschließt, so dass die Gesamtkomplexität O ( V ( lg V + E lg V) sein sollte ) ) = O (O(Vlg⁡V+Elg⁡V)≈O(Elg⁡V)forDECREASE-KEYO(Elg⁡V)whileEXTRACT-MINfor .O(V(lg⁡V+Elg⁡V))=O(Vlg⁡V+EVlg⁡V)≈O(EVlg⁡V)

Warum wird die Komplexitätsanalyse nicht als solche durchgeführt? und was ist falsch an meiner Formulierung?

Antworten:


9

Die Komplexität wird wie folgt abgeleitet. Die Initialisierungsphase kostet O(V) . Die while Schleife ausgeführt |V|mal. Die for innerhalb der verschachtelten Schleife while Schleife wird ausgeführt , degree(u) mal. Schließlich impliziert das Handshake-Lemma, dass es Θ(E) implizite DECREASE-KEYs gibt. Daher ist die Komplexität: Θ(V)∗TEXTRACT−MIN+Θ(E)∗TDECREASE−KEY .

Die tatsächliche Komplexität hängt von der tatsächlich im Algorithmus verwendeten Datenstruktur ab. Unter Verwendung eines Arrays ist TEXTRACT−MIN=O(V),TDECREASE−KEY=O(1) , die Komplexität ist O(V2) in der schlimmsten Fall.

Unter Verwendung eines binären Haufen, TEXTRACT−MIN=O(log⁡V),TDECREASE−KEY=O(log⁡V) , Komplexität O(Elog⁡V) im schlimmsten Fall. Hier ist der Grund: Da der Graph verbunden ist, dann |E|≥|V|−1 undE ist höchstensV2 (schlimmster Fall für einen dichten Graphen). Wahrscheinlich haben Sie diesen Punkt verpasst.

Unter Verwendung eines Fibonacci-Haufens wird TEXTRACT−MIN=O(log⁡V) amortisiert, TDECREASE−KEY=O(1) amortisiert, Komplexität ist O(E+Vlog⁡V) im schlimmsten Fall.


1

Ihre Idee scheint richtig zu sein. Nehmen wir die Komplexität als . Beachten Sie dann, dass wir in der inneren for-Schleife tatsächlich alle Eckpunkte und nicht die Kanten durchlaufen. Ändern wir also ein wenig zu V ( lg v + V lg v ) , was V lg v + V 2 lg v bedeutet . Für die Worst-Case-Analyse (dichte Graphen) ist V 2 ungefähr gleich der Anzahl der Kanten E , was V lg v + E ergibt V(lg⁡v+Elg⁡v)V(lg⁡v+Vlg⁡v)Vlg⁡v+V2lg⁡vV2EVlg⁡v+Elg⁡v=(V+E)lg⁡vV≪EElg⁡v


Was ist? v? Ein Tippfehler fürV.?
— David Richerby

Actually, I don't understand this at all. What does it mean to say "Let's take the complexity as [expression 1]" and then "modify a little to [expression 2]"? You can't just assume the running time is one thing and then change it to something else.
— David Richerby
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.