Union-Find Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati
Advertisements

Strutture dati per insiemi disgiunti
Insiemi disgiunti.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 7 - Tabelle hash Alberto Montresor Università di Trento This work is licensed under the Creative.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Strutture dati per insiemi disgiunti
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Capitolo 12 Minimo albero ricoprente Algoritmi e Strutture Dati.
Capitolo 9 Union-find Algoritmi e Strutture Dati.
Capitolo 12 Minimo albero ricoprente: Algoritmo di Kruskal Algoritmi e Strutture Dati.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Capitolo 12 Minimo albero ricoprente: Algoritmo di Kruskal Algoritmi e Strutture Dati.
Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest,
Statistiche d'ordine Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Fondamenti di Informatica A - Massimo Bertozzi ALBERI E ALBERI BINARI DI RICERCA (BST)
Alberi Binari di Ricerca Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Minimum Spanning Tree Moreno Marzolla
Cammini minimi Moreno Marzolla
Code con priorità Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Prof.ssa Rossella Petreschi Lezione del 29 /10/2014 del Corso di Algoritmica Lezione n°8.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Progettare algoritmi veloci usando strutture dati efficienti
Progettare algoritmi veloci usando strutture dati efficienti
Alberi di ricerca di altezza logaritmica
Analisi di sequenze di operazioni Union-Find
Logica binaria Moreno Marzolla
Lezione n°7 Prof.ssa Rossella Petreschi
Alberi binari Definizione Sottoalberi Padre, figli
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Correzione 1° Esonero Lezione n°13
B-alberi e alberi autoaggiustanti
Algoritmi e Strutture Dati
Complessità ammortizzata degli algoritmi Union Find
La gestione degli insiemi disgiunti
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Usi (meno scontati) della visita DFS
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Lezione n°4 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
K4 è planare? E K3,3 e K5 sono planari? Sì!
per rappresentare grafi
Lezione n°11 Prof.ssa Rossella Petreschi
UNION FIND Lezione n°8 Prof.ssa Rossella Petreschi
ABBINAMENTO Lezione n°13
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Lezione n°6 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Usi (meno scontati) della visita DFS
Progettare algoritmi veloci usando strutture dati efficienti
Estensione di strutture dati e
Algoritmi e Strutture Dati
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Insiemi disgiunti.
Algoritmi e Strutture Dati
Unione per ranghi compressi
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Transcript della presentazione:

Union-Find Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna

Algoritmi e Strutture Dati2 Original work Copyright © Alberto Montresor, Università di Trento, Italy ( Modifications Copyright © 2009—2011 Moreno Marzolla, Università di Bologna, Italy ( This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.

Algoritmi e Strutture Dati3 Struttura dati per insiemi disgiunti ● Motivazioni – In alcune applicazioni siamo interessati a gestire insiemi disgiunti di oggetti ● Operazioni fondamentali: – Creare un insieme a partire da un singolo elemento – Unire due insiemi – Identificare l'insieme a cui appartiene un elemento ● Struttura dati – Una collezione S = { S 1, S 2,..., S k } di insiemi dinamici disgiunti – Gli insiemi contengono complessivamente n≥k elementi – Ogni insieme è identificato da un rappresentante univoco

Algoritmi e Strutture Dati4 Scelta del rappresentante ● Il rappresentante di S i può essere un qualsiasi membro dell’insieme S i – Operazioni di ricerca del rappresentante su uno stesso insieme devono restituire sempre lo stesso oggetto – Solo in caso di unione con altro insieme il rappresentante può cambiare

Algoritmi e Strutture Dati5 Operazioni su strutture Union-Find ● makeSet(elem x) – Crea un insieme il cui unico elemento (e rappresentante) è x – x non deve appartenere ad un altro insieme esistente ● find(elem x)→name – Restituisce il rappresentante dell’unico insieme contenente x ● union(name x, name y) – Unisce i due insiemi rappresentati da x e da y – Assumiamo che il nome del nuovo insieme sia x (questa ipotesi non è strettamente necessaria) – I vecchi insiemi devono essere distrutti

Algoritmi e Strutture Dati6 Esempio (i valori sottolineati indicano il rappresentante) , , , 23, 45, 6 1, 2, 3, 45, 6 1, 2, 3, 4, 5, 6 makeSet(i) i=1..6 union(1,2) union(3,4) union(5,6) union(1,3) union(1,5)

Algoritmi e Strutture Dati7 Esempio di utilizzo ● Determinare le componenti connesse di un grafo non orientato dinamico, soggetto ad inserimenti di archi ● Algoritmo – Si inizia creando un insieme per ogni nodo del grafo – Per ogni arco (u,v) esegui union(find(u),find(v)) – Alla fine, avremo l'insieme delle componenti connesse ● Complessità – Costo: |V| makeSet + |E| union + 2|E| find – |V| = numero di nodi del grafo; |E| = numero di archi – Questo algoritmo è interessante per la capacità di gestire grafi dinamici (in cui gli archi vengono aggiunti)

Algoritmi e Strutture Dati8 Esempio

Algoritmi e Strutture Dati9 Esempio (i colori indicano le componenti connesse) u v find(u)≠find(v)

Algoritmi e Strutture Dati10 Implementazione di Union-Find ● Algoritmi elementari: – Algoritmo QuickFind: alberi di altezza uno ● makeSet(),find() : O(1); union() : O(n) – Algoritmo QuickUnion: alberi generali ● makeSet(),union() : O(1); find() : O(n) ● Algoritmi basati su euristiche di bilanciamento – QuickFind—Euristica sul peso – QuickUnion—Euristica sul rango ● Algoritmi basati su euristiche di compressione – QuickUnion: rango + compressione

Algoritmi e Strutture Dati11 QuickFind ● Ogni insieme viene rappresentato con un albero di altezza uno – Le foglie dell'albero contengono gli elementi dell'insieme – Il rappresentante è la radice a a b bcde {a}{b, c, d, e}

Algoritmi e Strutture Dati12 Nota implementativa ● È possibile rappresentare gli insiemi disgiunti tramite liste bcdea head4tailhead1tail Next Parent Info Count

Algoritmi e Strutture Dati13 QuickFind: Esempio— union(find(g), find(h)) fgdzche fc fgdzche fc

Algoritmi e Strutture Dati14 QuickFind ● Le operazioni makeSet() e find() richiedono tempo O(1): – makeSet(x) : crea un albero in cui l’unica foglia è x e il rappresentante di x è x stesso; costo O(1) – find(x) : restituisce il puntatore al padre di x; costo O(1) ● L’operazione union(A,B) richiede più tempo: – Tutte le foglie dell'albero B vengono spostate nell'albero A – Costo nel caso pessimo O(n), essendo n il numero complessivo di elementi in entrambi gli insiemi disgiunti ● Infatti nel caso peggiore B ha n-1 elementi

Algoritmi e Strutture Dati15 QuickUnion ● Implementazione basata su foresta – Si rappresenta ogni insieme tramite un albero radicato generico – Ogni nodo dell'albero contiene ● l'oggetto ● un puntatore al padre (la radice non ha padre) – Il rappresentante è la radice c he b f d g {c, e, h, b}{f, d, g}

Algoritmi e Strutture Dati16 QuickUnion ● makeSet(x) – Crea un albero con un unico nodo x – Costo: O(1) nel caso pessimo ● find(x) – Risale la lista dei padri di x fino a trovare la radice e restituisce la radice come oggetto rappresentante – Costo: O(n) nel caso pessimo ● union(A,B) – Appende l'albero B ad A, rendendo la radice di B figlia della radice di A – Costo: O(1) nel caso pessimo

Algoritmi e Strutture Dati17 QuickUnion: Esempio– union(c, f) c he b f d g c he b f d g

Algoritmi e Strutture Dati18 QuickUnion: Esempio– union(c, f) c e f d g c ef d g

Algoritmi e Strutture Dati19 Caso pessimo per find() makeSet(i) i=1..6 union(5,6) union(4,5) union(3,4)

Algoritmi e Strutture Dati20 Riepilogo

Algoritmi e Strutture Dati21 Considerazioni ● Quando usare.... – QuickFind? ● Quando le union() sono rare e le find() frequenti – QuickUnion? ● Quando le find() sono rare e le union() frequenti ● È importante sapere che esistono tecniche euristiche che permettono di migliorare questi risultati

Algoritmi e Strutture Dati22 QuickFind: Euristica sul peso ● Una strategia per diminuire il costo dell’operazione union() in QuickFind consiste nel: – Memorizzare nella radice il numero di elementi dell'insieme; la dimensione può essere mantenuta in tempo O(1) – Appendere l'insieme con meno elementi a quello con più elementi fgche fc fgche ff Notare che cambiamo il nome del rappresentante perché stiamo assumendo che l'insieme union(A,B) abbia nome A union(f,c)

Algoritmi e Strutture Dati23 Osservazioni / 1 ● Ogni volta che una foglia di un albero QuickFind bilanciato acquista un nuovo padre, fa parte di un insieme che ha almeno il doppio di elementi di quello cui apparteneva ● Dimostrazione – union(A,B) con size(A) ≥ size(B) ● Le foglie di B cambiano padre ● size(A)+size(B) ≥ size(B)+size(B) = 2 size(B) – union(A,B) con size(A) ≤ size(B) ● Le foglie di A cambiano padre ● size(A)+size(B) ≥ size(A)+size(A) = 2 size(A)

Algoritmi e Strutture Dati24 Osservazioni / 2 ● Alberi QuickFind con bilanciamento sulla union supportano n operazioni makeSet(), m operazioni find(), ed al più (n-1) operazioni union() in tempo totale O(m + n log n). L'occupazione di memoria è O(n) ● Dimostrazione – n makeSet() ed m find() costano O(n+m) – Dimostriamo che le (n-1) union() richiedono tempo complessivo O(n log n)

Algoritmi e Strutture Dati25 Costo (n-1) union: metodo dei crediti ● Associamo (log 2 n) crediti ad ogni elemento – Vengono “pagati” da makeSet() ● Ogni volta che colleghiamo un nodo ad un nuovo padre, consumiamo un credito di quel nodo ● (log 2 n) crediti sono sufficienti – Ad ogni union in cui l'elemento cambia padre, la dimensione dell'insieme cui l'elemento entra a far parte è almeno il doppio dell'insieme originario – Dopo k union, ogni elemento appartiene ad un insieme con almeno 2 k ≤n elementi – Quindi al più ci possono essere k≤(log 2 n) cambiamenti di paternità per ogni elemento

Algoritmi e Strutture Dati26 QuickUnion Euristica “union by rank” ● Il problema degli alberi QuickUnion è che possono diventare troppo alti – quindi rendere inefficienti le operazioni find() ● Idea: – Rendiamo la radice dell'albero più basso figlia della radice dell'albero più alto ● Ogni radice mantiene informazioni sul proprio rango – il rango rank(x) di un nodo x è il numero di archi del cammino più lungo fra x e una foglia sua discendente – rango ≡ altezza del sottoalbero radicato sul nodo

Algoritmi e Strutture Dati27 BA B A union(A,B) rank(A) := rank(A)+1 BA B A union(A,B) rank(A) non cambia BA B A union(A,B) Scambia A con B e rank(A) con rank(B)

Algoritmi e Strutture Dati28 Esempio makeSet(i) i=1..6 union(5,6) union(4,5) union(3,5)

Algoritmi e Strutture Dati29 Proprietà alberi QuickUnion bilanciati ● Un albero QuickUnion bilanciato in altezza avente il nodo x come radice ha n≥2 rank(X) nodi ● Dimostrazione: induzione sul numero di operazioni union() effettuate – Base (0 operazioni union): tutti gli alberi hanno rango zero (singolo nodo) quindi hanno esattamente 2 0 =1 nodi – Induzione: consideriamo cosa succede prima e dopo una operazione union(A,B) ● A U B denota l'insieme ottenuto dopo l'unione ● rank(A U B) è l'altezza dell'albero che denota A U B ● |A U B| è il numero di nodi dell'albero A U B, e risulta |A U B| = |A| + |B| perché stiamo unendo sempre insiemi disgiunti

Algoritmi e Strutture Dati30 Passo induttivo caso rank(A) < rank(B) ● |A U B| = |A|+|B| ● rank(A U B) = rank(B) – perché l'altezza dell'albero A U B è uguale all'altezza dell'albero B ● Per ipotesi induttiva, |A|≥2 rank(A), |B|≥2 rank(B) ● Quindi BA A B union(A,B) Nota: per chiarezza NON ho scambiato A con B

Algoritmi e Strutture Dati31 Passo induttivo caso rank(A) > rank(B) ● |A U B| = |A|+|B| ● rank(A U B) = rank(A) – perché l'altezza dell'albero A U B è uguale all'altezza dell'albero A ● Per ipotesi induttiva, |A|≥2 rank(A), |B|≥2 rank(B) ● Quindi BA B A union(A,B)

Algoritmi e Strutture Dati32 Passo induttivo caso rank(A) = rank(B) ● |A U B| = |A|+|B| ● rank(A U B) = rank(A) +1 ● Per ipotesi induttiva, |A|≥2 rank(A), |B|≥2 rank(B) ● Quindi BA B A union(A,B)

Algoritmi e Strutture Dati33 Teorema ● Durante una sequenza di operazioni makeSet(), union() e find(), l'altezza di un albero QuickUnion bilanciato è ≤ (log 2 n), essendo n il numero di operazioni makeSet() ● Dimostrazione – L'altezza di un albero QuickUnion A è rank(A) – Da quanto appena visto, 2 rank(A) ≤n – Quindi altezza = rank(A) ≤ (log 2 n) ● Quindi: – makeSet() ha costo O(1) nel caso pessimo – union() ha costo O(1) nel caso pessimo – find() ha costo O(log n) nel caso pessimo

Algoritmi e Strutture Dati34 QuickUnion Euristica “union by size” ● Sia size(A) il numero di nodi contenuti nell'albero A ● QuickUnion con bilanciamento sulla cardinalità: in caso di operazione union(A,B) – se size(A) ≥ size(B), rendi B figlio della radice di A – se size(A) < size(B), rendi A figlio della radice di B ● Si dimostra (allo stesso modo appena visto) che applicando il bilanciamento sulla cardinalità, l'altezza degli alberi è sempre minore o uguale (log 2 n) – Valgono quindi gli stessi costi del bilanciamento sull'altezza

Algoritmi e Strutture Dati35 Riepilogo