Questa versione densa dell'algoritmo di Kruskal è ben nota?


15

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 O(mlogm) (senza assumere bordi preordinati). In particolare, otteniamo Θ(n2) 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 componente i, si verifichi l'incidente con il bordo di attraversamento del componente più leggero i.

  • Quando trovi il bordo più leggero che attraversa le partizioni, trova semplicemente iche minimizza il peso di dist[i], in tempo lineare.

  • cicjUN per tutti i componenti k e contrassegnare i come non più rappresentativo del componente collegato (rimarràsolo j ).UNio,K=min{UNio,K,UNj,K}Kioj

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.n-1Θ(n2)

Questa versione di Kruskal è ben nota in letteratura?

Risposte:


19

O(n2)O(n2)

  1. Usa invece Prim – Dijkstra – Jarník e poi ordina i bordi per ottenere la sequenza di inserimento che Kruskal darebbe, oppure

  2. Utilizzare la struttura di dati a coppia più vicina quadtree descritta nel documento, visualizzando Kruskal come una procedura di raggruppamento agglomerativo standard in cui uniamo i due cluster più vicini in un super cluster in ogni fase, con "più vicino" definito come la lunghezza del bordo più corto che collega due cluster .

La soluzione 2 è simile nello spirito a ciò che descrivi, ma i dettagli su come tenere traccia delle distanze tra i cluster sono leggermente diversi. Mantieni i minimi di riga della matrice di distanza del cluster, permettendoti di scansionare questo elenco di minimi di riga in tempo lineare per trovare il minimo globale, mentre il mio documento si sovrappone a un quadrifoglio sulla stessa matrice e tiene traccia del minimo in ogni quadrata quadrata. Il tuo metodo è più semplice, ma meno flessibile per alcuni altri problemi dinamici della coppia più vicina (dipende dal fatto che la fusione di due cluster fa diminuire le loro distanze con altri cluster, vero per questo problema ma non necessariamente per altri).

O(n2)O(n2)O(n)

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.