Circa un anno fa, io e un amico abbiamo pensato a un modo per implementare l'algoritmo di Kruskal per i grafici densi in modo migliore rispetto al solito limite (senza assumere bordi preordinati). In particolare, otteniamo in tutti i casi, simile a quello di Prim quando implementato usando matrici di adiacenza.
Ho pubblicato un post sull'algoritmo nel mio blog , inclusi codice C ++ e benchmark, ma ecco l'idea generale:
Mantenere un nodo rappresentativo per ciascun componente collegato. Inizialmente, tutti i nodi si rappresentano.
Mantenere un vettore in modo
dist[i]
tale che, per ogni componentei
, si verifichi l'incidente con il bordo di attraversamento del componente più leggeroi
.Quando trovi il bordo più leggero che attraversa le partizioni, trova semplicemente
i
che minimizza il peso didist[i]
, in tempo lineare.per tutti i componenti k e contrassegnare i come non più rappresentativo del componente collegato (rimarràsolo j ).
La contrazione del bordo più leggero e il rilevamento di detto bordo possono quindi essere entrambi eseguiti in tempo lineare. Facciamo questo volte per trovare il MST. È necessaria una piccola contabilità per trovare effettivamente quale vantaggio vogliamo aggiungere al MST, ma non aumenta la complessità. Pertanto il tempo di esecuzione è Θ ( n 2 ) . L'implementazione è solo un paio di loop.
Questa versione di Kruskal è ben nota in letteratura?