You are on page 1of 7

Minimum Spanning Tree: confronto tra gli algoritmi di Kruskal e Prim.

Michele Milesi1 Corso di Ricerca Operativa AA 1999/2000 Polo Didattico e di Ricerca di Crema Universit degli Studi di Milano

Sommario
Comparazione dei due principali algoritmi, Kruskal e Prim, per la soluzione del problema del minimo albero coprente (MSTP) di un grafo connesso. Il confronto ha come fine il determinare in quali casi preferire una soluzione allaltra rispetto alla natura del grafo preso in esame; natura determinata dal numero di nodi e di spigoli, dalla densit degli spigoli e dallinsieme dei valori (range) che pu assumere il peso dei singoli archi.

Introduzione
Il confronto tra i due algoritmi si appoggia alle versioni descritte da Sedgewick [1]. Nel suo libro Sedgewick afferma che il costo, in tempo, dei due algoritmi di: (K) T ?G ? ? ? ?E log ?E ?? per Kruskal e di: (P) T ( G) ? ? V 2 per Prim, dove E e V indicano rispettivamente il numero di spigoli (edge) e nodi (vertex) presenti nel grafo. Anche se dal confronto dei casi peggiori appare che Prim costi meno, in termini di tempo, rispetto a Kruskal, Sedgewick afferma che Prim pi adatto a gestire grafi molto densi al contrario di Kruskal il quale ottiene risultati migliori con grafi sparsi. Laffermazione intuitivamente dimostrabile dal fatto che in un grafo completo il numero di spigoli pari a: V (V ? 1) (1) E? 2 sostituendo (1) in (K) otteniamo: (K) T ( G) ? ? V 2 log ? ? V che maggiora (P), mentre noto che il valore minimo di spigoli poich un grafo possa essere connesso e pari a: (2) E ?V ?1 sostituendo nuovamente (2) in (K) otteniamo:

? ?

Email: mmilesi@crema.unimi.it Matricola 566535.

(K) T ( G) ? ? ? log ? ?? V V la quale una minorante di (P). Sedgewick non da nessunindicazione su quale sia la soglia oltre la quale conviene adottare una soluzione piuttosto che laltra; non indica nemmeno il comportamento dei due algoritmi rispetto al variare del range dei pesi associati agli spigoli. Lo scopo di questo confronto di verificare le affermazioni di Sedgewick e dare una valutazione quantitativa/qualitativa degli algoritmi. Gli algoritmi sono testati su di un insieme di grafi generati casualmente.

Struttura dei Grafi


Generazione dei Grafi
Gli elementi di test sono generati come riduzione di un grafo completo, ad ogni grafo associato una valore di densit che indica la probabilit che ogni spigolo che appartiene al grafo completo sia presente anche nel grafo generato. Ad ogni spigolo presente nel grafo associato casualmente un peso compreso in unestensione indicata in fase di generazione. Per ogni parametro sono stati generati tre grafi differenti. I valori utilizzati per la creazione dei grafi sono i seguenti: Numero di nodi 50, 100, 200, 400, 800, 1200 Densit 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100% Range di pesi [1, 1], [1, 10], [1, 100], [1, 1000]

Struttura dati
Gli spigoli sono memorizzati in una lista non ordinata; i nodi sono contenuti in una seconda lista ordinata che fa da intestazione per una matrice dadiacenza contenente gli spigoli che collegano i vari nodi. Ad ogni spigolo associato un peso.

Gli Algoritmi
Per la scelta della versione degli algoritmi da implementare mi sono rifatto a quelle riportate da Sedgewick in [1]. Lalgoritmo di Kruskal riportato a pagina 460 con il nome kruskal mentre Prim a pagina 466 con il nome matrixpfs. Gli algoritmi sono stati scritti in Java, ma sono facilmente traducibili in C 2 .

Kruskal
Nella versione proposta da Sedgewick utilizzata una struttura Heap per mantenere una lista prioritaria contenete gli spigoli da valutare, ordinati per peso crescente.

possibile trovare gli algoritmi scritti in C/C++ direttamente da Sedgewick in Algorithms in C.

Avendo gi un vettore contenete gli spigoli ho deciso di evitare luso della struttura Heap preferendo ordinare il vettore tramite lalgoritmo di quicksort [2]. Sia linserimento nello Heap che il quicksort hanno costo: (3) O?N log?N ??: che non varia il costo di (K). E in ogni caso interessante vedere quanto lordinamento iniziale pesi al momento dellesecuzione e se il non dover effettuare lordinamento iniziale, perch gli elementi sono gi ordinati a prescindere dallesecuzione dellalgoritmo, pu influire variare il range dei valori per i quali utile preferire un algoritmo allaltro.

Prim
E adottata la versione proposta da Sedgewick, con lunica variante che lindicatore di root dellalbero il valore 1 nel vettore parent .

Valutazione dei costi


Potendo eseguire le prove solo in sistemi multitasking la misura del tempo in secondi non consigliabile, ho allora deciso di contare il numero doperazioni elementari3 che i programmi eseguo no per arrivare alla soluzione. Ho introdotto come unit di misura il tic, ogni assegnamento e confronto non composto, vale un tic, alla fine dogni esecuzione prendo nota dei tic effettuati. I due algoritmi partono dalla medesima condizione, il grafo, e restituiscono lelenco degli spigoli che compongono lalbero.

I Risultati
Nodi
Confrontando i dati ottenuti valutando per nodo si ottiene il grafico in Figura 1. Si nota subito che, indipendentemente dal numero di nodi, Prim risulta essere pi efficiente di Kruskal. Anche se, per essere sinceri, lordinamento non ha un grande peso in Kruskal (la differenza tra il solo algoritmo e il totale minima) esso sempre pi oneroso di Prim. Bisogna per tener conto che sia Kruskal che Quicksort sono valutati in termini di vertici e non di nodi, Sedgwick stesso formula le sue affermazioni parlando di densit (vertici).

In un linguaggio ad alto livello le istruzioni elementari si riducono agli assegnamenti ed ai confronti, senza per poter aver indice del peso reale di questi determinato dalla conversione dei tipi, dallaccesso alla memoria e da tutte le misurazioni tipiche del livello macchina.

Figura 1

Spigoli
Osservando i risultati classificati per vertici, Figura 2, si inizia ad avere un riscontro in merito allaffermazione di Sedgewick. Anche in questo caso Prim si dimostra comportarsi meglio e lalgoritmo di ordinamento ha, nella maggioranza dei casi, un costo superiore a Prim. Viene per evidenziata una partizione dei valori creando una zona, limitata in verit, dove risulta conveniente utilizzare Kruskal piuttosto che Prim. Si nota anche che Kruskal in tutte le sue componenti sensibile allaumentare degli spigoli. Prim, con il suo andamento a scalini si dimostra meno sensibile.
Figura 2

Se osserviamo in dettaglio solo un sottoinsieme dei risultati, riportati in Figura 3, possiamo notare che fino ai duecento archi Kruskal migliore di Prim; se poi scorporiamo lordinamento dal costo totale possiamo spingerci ad utilizzare Kruskal fin quasi seicento archi. Da evidenziare il fatto che in questi casi lordinamento costa quasi quanto, se non di pi, del semplice Kruskal.

Figura 3

Ampiezza del range dei costi


Confrontando gli algoritmi rispetto alla ampiezza del range dei costi associati ad ogni spigolo, possiamo delinearne il comportamento rispetto alla necessita di determinare quale sia lo spigolo di costo minore che deve essere inserito nella soluzione. Pi ristretto il range dei valori tanto pi probabile che il prossimo vertice da valutare possa appartenere ad una soluzione ottima. Dai dati riportati in Figura 4 si nota che Prim non risente minimamente del variare del range cosa che invece succede sia a Kruskal che allalgoritmo di ordinamento. Il motivo che per Prim viene ricercato il vertice di connessione di costo minimo localmente al nodo, mentre Kruskal ricerca il prossimo vertice tra tutti quelli non ancora utilizzati (o scartati).
Figura 4

Densit
Valutando il comportamento degli algoritmi in base alla densit degli spigoli notiamo quanto questi influenzino i tempi desecuzione degli algoritmi. Dal grafico riportato in Figura 5 abbiamo conferma che Prim indipendente dal numero di spigoli presenti, lo dimostra il fatto che la linea di tendenza, interpolata linearmente, risulti essere quasi parallela allasse delle ordinate denotando un comportamento costante rispetto al parametro preso in esame. Al contrario sia Kruskal che lalgoritmo di ordinamento risentono pesantemente del variare della densit degli spigoli le prestazioni peggiorano; una conferma data anche da quanto si detto in merito alla valutazione per numero di spigoli.
Figura 5

Conclusioni
Nei casi presi in esame Prim sembra essere quasi sempre la scelta migliore; non a caso Hillier e Lieberman riportano solo Prim come soluzione al problema MST. Se per si evitano i confronti numerici, in quanto locali ai test effettuati, e limitandoci a quelli qualitativi/comportamentali posiamo dire che Kruskal preferibile a Prim in alcune condizioni ben precise. Abbiamo gi evidenziato che Kruskal si comporta m eglio di Prim in presenza di un numero relativamente basso di spigoli; ma possibile ottenere qualche miglioramento effettuando alcune trasformazioni sul grafo. Ad esempio abbiamo notato che allaumentare dellampiezza del range dei valori le prestazioni di Kruskal peggiorano mentre quelle di Prim restano pressoch inalterate. leggendo il risultato al contrario potrei ipotizzare che diminuendo il range migliorerei le prestazioni. Per poter ottenere dei range pi piccoli potrei dividere gli spigoli di costo superiore inserendo dei vertici fittizi; tra laltro questi nodi fittizi sono scarsamente sconnessi, giusto due spigoli, diminuendo cos la densit complessiva del grafo, altro parametro per cui Kruskal migliora mentre Prim resta immutato. Il limite di questa supposizione sta nellintroduzione di nuovi vertici e nel necessario preprocessing.

Un sicuro punto a favore di Kruskal loccupazione di spazio, poich: Prim ha unoccupazione di spazio valutata come: (Ps) S (G ) ? ? V 2 che a seconda del tipo di versione dellalgoritmo utilizzata valida alluguaglianza, nel caso della matrice, piuttosto che una maggiorazione stretta, per la versione con le liste. Loccupazione di spazio per Kruskal cresce linearmente al numero di spigoli presenti nel grafo: (Ks) S ?G? ? ? ?E ?. Quindi Kruskal avr un costo in spazio sempre inferiore a Prim, al pi uguale. Il problema delloccupazione di spazio pu sembrare superfluo, attualmente tutti i sistemi operativi rendono disponibile agli algoritmi uno spazio di memoria virtualmente infinito, ma anche vero che la tecnologia attuale si sta spingendo verso quei sistemi definiti Embedded dove le dimensioni della memoria, se non dei programmi, sono ancora dei forti limiti.

? ?

Bibliografia
[1] Robert Sedgewick, Algoritms. Second Edition. Addison-Wesley Publishing Company, 1989 [2] Niklaus Wirth, Algoritmi + Strutture Dati = Programmi. Tecniche Nuove, 1987 [3] Frederick Hillier, Gerald Lieberman, Introduction to operations research. McGraw-Hill, 1995

You might also like