Quando dovrei usare Kruskal invece di Prim (e viceversa)?


Risposte:


201

Usa l'algoritmo di Prim quando hai un grafico con molti spigoli.

Per un grafico con i bordi a V vertici E , l'algoritmo di Kruskal viene eseguito nel tempo O (E log V) e l'algoritmo di Prim può essere eseguito nel tempo ammortizzato O (E + V log V) , se si utilizza un heap Fibonacci .

L'algoritmo di Prim è significativamente più veloce nel limite quando hai un grafico davvero denso con molti più spigoli che vertici. Kruskal ha prestazioni migliori in situazioni tipiche (grafici sparsi) perché utilizza strutture di dati più semplici.


8
Direi "situazioni tipiche" invece della media .. Penso che sia un termine oscuro da usare, per esempio qual è la "dimensione media" di una tabella hash? nessuna idea.
yairchu,

2
@SplittingField: credo che stai confrontando mele e arance. L'analisi ammortizzata è un modo semplice per ottenere una misurazione della funzione (per così dire) --- se è il caso peggiore o il caso medio dipende da ciò che stai dimostrando. In effetti (come lo cerco ora), l'articolo wiki usa un linguaggio che implica che è usato solo per l'analisi del caso peggiore. Ora, usando una tale analisi significa che non puoi fare promesse altrettanto forti sul costo di una particolare operazione, ma quando l'algoritmo viene eseguito, sarà effettivamente da O (E + VlogV), anche nel caso peggiore.
agorenst,

10
In teoria suona bene, ma scommetto che poche persone possono implementare un mucchio di Fibonacci
Alexandru,

2
@tgamblin, nel peggiore dei casi ci possono essere bordi C (V, 2). Quindi, la completezza temporale dell'algoritmo di Prim si riduce a O (V ^ 2 + VlogV) cioè O (V ^ 2) in caso di mucchio di fibonacci?
Folletto verde,

7
C'è anche un altro fattore importante: l'output di Prims è un MST solo se il grafico è collegato (l'output mi sembra inutile altrimenti), ma l'output del Kruskal è il minimo Spanning forest (con qualche uso).
Andrei I,

102

Ho trovato un bel thread in rete che spiega la differenza in un modo molto semplice: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

L'algoritmo di Kruskal svilupperà una soluzione dal limite più economico aggiungendo il successivo limite più economico, a condizione che non crei un ciclo.

L'algoritmo di Prim svilupperà una soluzione da un vertice casuale aggiungendo il successivo vertice più economico, il vertice che non è attualmente nella soluzione ma collegato ad esso dal margine più economico.

In allegato un interessante foglio su questo argomento.inserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagine

Se implementi sia Kruskal che Prim, nella loro forma ottimale: con un ritrovamento sindacale e un mucchio di finbonacci rispettivamente, noterai come Kruskal sia facile da implementare rispetto a Prim.

Prim è più difficile con un heap di fibonacci principalmente perché è necessario mantenere una tabella di contabilità per registrare il collegamento bidirezionale tra nodi del grafico e nodi dell'heap. Con Union Find, è il contrario, la struttura è semplice e può persino produrre direttamente il primo senza quasi alcun costo aggiuntivo.


2
Nitpick: L'ultima 'diapositiva' in ciascuna dovrebbe leggere "ripeti finché non hai un albero spanning"; non fino a MST, che è una sorta di compito ricorsivo - come faccio a sapere che è minimo - ecco perché sto seguendo Prim / Kruskal per cominciare!
OJFord,

@OllieFord Ho trovato questa discussione per aver cercato una semplice illustrazione degli algoritmi di Prim e Kruskal. Gli algoritmi garantiscono che troverai un albero e quell'albero è un MST. E sai che hai trovato un albero quando hai esattamente i V-1 bordi.
mikedu95,

@ mikedu95 Hai ragione, facendo lo stesso punto del mio commento precedente da una diversa angolazione.
OJFord,

Ma non è un prerequisito che devi scegliere solo con un singolo peso tra i vertici, non puoi scegliere il peso 2 più di una volta dal grafico sopra, devi scegliere il peso successivo es: 3 @Snicolas
ani0904071

30

So che non hai chiesto questo, ma se hai più unità di elaborazione, dovresti sempre considerare l'algoritmo di Borůvka , perché potrebbe essere facilmente parallelizzato - quindi ha un vantaggio in termini di prestazioni rispetto all'algoritmo Kruskal e Jarník-Prim.


23

Kruskal può avere prestazioni migliori se i bordi possono essere ordinati in tempo lineare o se sono già ordinati.

Prim è migliore se il numero di spigoli a vertici è alto.


19

Il caso peggiore della complessità temporale di Kruskal è O (E log E) , questo perché dobbiamo ordinare i bordi. Il caso peggiore della complessità del tempo principale è O (E log V) con coda prioritaria o, meglio ancora, O (E + V log V) con Heap Fibonacci . Dovremmo usare Kruskal quando il grafico è scarso, per esempio un piccolo numero di bordi, come E = O (V), quando i bordi sono già ordinati o se possiamo ordinarli in tempo lineare. Dovremmo usare Prim quando il grafico è denso, cioè il numero di bordi è alto, come E = O (V²).


Mi sembra che Prim non sia mai peggio di Kruskal in termini di velocità. Poiché E dovrebbe essere almeno V-1 c'è un albero di spanning. Penso che il motivo per cui potremmo preferire Kruskal per un grafico sparso è che la sua struttura di dati è molto semplice.
Yu Gu

16

Se fermiamo l'algoritmo nell'algoritmo di Middle Prim genera sempre albero connesso, ma kruskal d'altra parte può dare albero o foresta disconnesso


5

Un'importante applicazione dell'algoritmo di Kruskal è il clustering a collegamento singolo .

Considera n vertici e hai un grafico completo. Per ottenere gruppi di ak di quei n punti. Algoritmo di Kruskal sui primi n- (k-1) bordi dell'insieme ordinato di bordi. Ottieni k-cluster del grafico con il massimo spaziatura.


3

Il momento migliore per Kruskal è O (E logV). Se Prim usa un mucchio di fib possiamo ottenere O (E + V lgV). Pertanto, su un grafico denso, Prim è molto meglio.


2

Prim è meglio per grafici più densi, e anche in questo non dobbiamo prestare molta attenzione ai cicli aggiungendo un vantaggio, poiché abbiamo a che fare principalmente con i nodi. Prim è più veloce di Kruskal nel caso di grafici complessi.


2

Nell'algoritmo kruskal abbiamo il numero di spigoli e il numero di vertici su un dato grafico ma su ogni spigolo abbiamo un valore o un peso per conto del quale possiamo preparare un nuovo grafico che non deve essere ciclico o non chiudere da nessun lato Ad esempio

grafico come questo _____________ | | | | | | | __________ | | Dai un nome a qualsiasi vertice a, b, c, d, e, f.

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.