MST: complessità dell'algoritmo di Prim, perché no


8

Secondo CLRS, gli algoritmi di Prim sono implementati come di seguito:

MST-PRIM(G,w,r)

  • per ciascuno u∈V[G] fare
    • key[u]←∞
    • π[u]←NIL
  • key[r]←0
  • Q←V[G]
  • mentre Q≠∅ fare // ... O(V)
    • u ← EXTRACT-MIN(u) // ... O(lg⁡V)
      • per ciascuno v∈adj[u] fare // ... O(E)
        • Se v∈Q e w(u,v)>key[v]
          • poi π[v]←u
            • key←w(u,v) // DECREASE-KEY ... O(lg⁡V)

Il libro dice che la complessità totale è O(Vlg⁡V+Elg⁡V)≈O(Elg⁡V). Tuttavia, quello che ho capito è che il forciclo interno con l' DECREASE-KEYoperazione costeràO(Elg⁡V)e il whileloop esterno racchiude sia il loop EXTRACT-MINinterno che quello interno for, quindi la complessità totale dovrebbe essereO(V(lg⁡V+Elg⁡V))=O(Vlg⁡V+EVlg⁡V)≈O(EVlg⁡V).

Perché l'analisi della complessità non viene eseguita come tale? e cosa c'è di sbagliato nella mia formulazione?

Risposte:


9

La complessità è derivata come segue. La fase di inizializzazione costaO(V). Ilwhile il ciclo viene eseguito |V|volte. Ilfor loop nidificato all'interno di while il ciclo viene eseguito degree(u)volte. Infine, il lemma dell'handshaking implica che ci sonoΘ(E)DECREASE-KEY implicito. Pertanto, la complessità è:Θ(V)∗TEXTRACT−MIN+Θ(E)∗TDECREASE−KEY.

La complessità effettiva dipende dalla struttura dei dati effettivamente utilizzata nell'algoritmo. Utilizzando un array,TEXTRACT−MIN=O(V),TDECREASE−KEY=O(1), la complessità è O(V2) Nel peggiore dei casi.

Utilizzando un heap binario, TEXTRACT−MIN=O(log⁡V),TDECREASE−KEY=O(log⁡V), la complessità è O(Elog⁡V)Nel peggiore dei casi. Ecco perché: dal momento che il grafico è collegato, quindi|E|≥|V|−1, e E è al massimo V2(nel peggiore dei casi, per un grafico denso). Probabilmente hai perso questo punto.

Usando un mucchio di Fibonacci, TEXTRACT−MIN=O(log⁡V) ammortizzato, TDECREASE−KEY=O(1) ammortizzato, la complessità è O(E+Vlog⁡V) Nel peggiore dei casi.


1

La tua idea sembra corretta. Prendiamo la complessità come V(lg⁡v+Elg⁡v). Quindi nota che nel ciclo interno per, stiamo effettivamente attraversando tutti i vertici e non i bordi, quindi modifichiamo un po 'per V(lg⁡v+Vlg⁡v), che significa Vlg⁡v+V2lg⁡v. Ma per l'analisi del caso peggiore (grafici densi),V2 è approssimativamente uguale al numero di spigoli, E, dando Vlg⁡v+Elg⁡v=(V+E)lg⁡v ma da allora V≪E, quindi Elg⁡v.


Cosa c'è v? Un errore di battitura perV?
— David Richerby,

In realtà, non lo capisco affatto. Che cosa significa dire "Prendiamo la complessità come [espressione 1]" e poi "modifichiamo un po 'in [espressione 2]"? Non puoi semplicemente supporre che il tempo di esecuzione sia una cosa e poi cambiarlo in qualcos'altro.
— David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.