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 uV[G] fare
    • key[u]
    • π[u]NIL
  • key[r]0
  • QV[G]
  • mentre Q fare // ... O(V)
    • u EXTRACT-MIN(u) // ... O(lgV)
      • per ciascuno vadj[u] fare // ... O(E)
        • Se vQ e w(u,v)>key[v]
          • poi π[v]u
            • keyw(u,v) // DECREASE-KEY ... O(lgV)

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

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

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

Utilizzando un heap binario, TEXTRACTMIN=O(logV),TDECREASEKEY=O(logV), la complessità è O(ElogV)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, TEXTRACTMIN=O(logV) ammortizzato, TDECREASEKEY=O(1) ammortizzato, la complessità è O(E+VlogV) Nel peggiore dei casi.


1

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


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.