Strutture dati per insiemi disgiunti

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati
Advertisements

Estendere i linguaggi: i tipi di dato astratti
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Algoritmi e Strutture Dati
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
RB-alberi (Red-Black trees)
Alberi binari di ricerca
Heap binomiali.
Cammini minimi con sorgente singola
Insiemi disgiunti.
Reaching Definitions. Tino CortesiTecniche di Analisi di Programmi 2 Reaching definitions Dato un punto del programma, quali sono i comandi di assegnamento.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Strutture dati per.
Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Esercizi su alberi binari
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 05/05/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmo di Ford-Fulkerson
Algoritmi e strutture Dati - Lezione 7
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
Algoritmi e Strutture Dati (Mod. A)
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati 20 aprile 2001
Algoritmi e Strutture Dati
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Algoritmo di Kruskal Parte con tutti i vertici e nessun lato (sottografo aciclico, o foresta, ricoprente) Ordina i lati per costo non decrescente.
Sottoinsiemi disgiunti
Heap binari e HeapSort.
Heap binomiali Gli heap binomiali sono strutture dati su cui si possono eseguire efficientemente le operazioni: Make(H) : crea uno heap vuoto Insert(H,
Fibonacci Heaps e il loro utilizzo nell’algoritmo di Prim
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Elementi di Informatica di base
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 K 4 è planare? Sì!
1101 = x 10 x 10 x x 10 x = CORRISPONDENZE
Algoritmi e Strutture Dati
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Strutture dati per insiemi disgiunti Alberi di copertura minimi
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
1 Analisi ammortizzata Si considera il tempo richiesto per eseguire, nel caso pessimo, una intera sequenza di operazioni. Se le operazioni costose sono.
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.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Capitolo 12 Minimo albero ricoprente: Algoritmo di Kruskal Algoritmi e Strutture Dati.
Transcript della presentazione:

Strutture dati per insiemi disgiunti Servono a mantenere una collezione S = {S1, S2, ..., Sk} di insiemi disgiunti. Ogni insieme Si è individuato da un rappresentante che è un particolare elemento dell’insieme. Insiemi disgiunti

Operazioni sugli insiemi disgiunti: MakeSet(x) : aggiunge alla struttura dati un nuovo insieme singoletto { x }. Si richiede che x non compaia in nessun altro insieme della struttura. FindSet(x) : ritorna il rappresentante dell’insieme che contiene x. Union(x,y) : unisce i due insiemi contenenti x ed y in un’unico insieme.

Esercizio 29. Descrivere un algoritmo che utilizza una struttura dati per insiemi disgiunti per determinare se un grafo non orientato G = (V,E) è connesso.

Rappresentazione con liste Si usa una lista circolare per ciascun insieme. Ogni nodo ha - un puntatore al nodo successivo - un puntatore al nodo rappresentante. c h e b Rappresentazione con liste

I nodi hanno i seguenti campi: info : l’informazione contenuta nel nodo rappr : il puntatore al rappresentante succ : il puntatore al nodo successivo Le operazioni sono: f x MakeSet(x) rappr[x]  x succ[x]  x FindSet(x) return rappr[x] c h e x

c h e b f g d x y c h e b f g d x y

Union(x, y)  cambia i puntatori al rappresentante nella lista di y rappr[y]  rappr[x], z  succ[y] while z  y do rappr[z]  rappr[x], z  succ[z]  concatena le due liste z  succ[x], succ[x]  succ[y], succ[y]  z

La complessità di Union dipende dal numero di iterazioni richieste dal ciclo che cambia i puntatori al rappresentante dei nodi della lista contenente y. Quindi Union ha complessità O(ny) dove ny è la lunghezza della seconda lista.

Consideriamo la seguente sequenza di 2n-1 operazioni: MakeSet(x1)  costo 1 MakeSet(x2)  costo 1 ....... MakeSet(xn)  costo 1 Union(x2, x1)  costo 1 Union(x3, x1)  costo 2 Union(x4, x1)  costo 3 Union(xn, x1)  costo n-1 Il costo totale è proporzionale ad n + n(n-1)/2 ed è quindi (n2). Di conseguenza Union ha costo ammortizzato O(n).

Euristica dell’unione pesata La complessità (n2) dell’esempio è dovuta al fatto che in ogni Union la seconda lista (percorsa per aggiornare i puntatori al rappresentante) è la più lunga delle due. L’euristica dell’unione pesata consiste nello scegliere sempre la lista più corta per aggiornare i puntatori al rappresentante. Euristica dell’unione pesata

Si memorizza la lunghezza di della lista in un nuovo campo l del rappresentante.

Le nuove funzioni: MakeSet(x) l[x]  1 succ[x]  x rappr[x]  x FindSet(x) return rappr[x]

Union(x, y) x  rappr[x] y  rappr[y]  se la lista di x è più corta scambia x con y if l[x] < l[y] then z  x, x  y, y  z  somma le lunghezze l[x]  l[x] + l[y]  cambia rappresentante alla lista di y rappr[y]  x, z  succ[y] while z  y do rappr[z]  x, z  succ[z]  concatena le due liste z  succ[x], succ[x]  succ[y], succ[y]  z

Complessità con l’euristica dell’unione pesata. Una sequenza di m operazioni MakeSet, Union e FindSet delle quali n sono MakeSet, richiede tempo O(m + n log n). La complessità ammortizzata delle operazioni è: Se il numero di MakeSet è molto minore del numero di Union e FindSet per cui n log n = O(m)

Dimostriamo quindi che una sequenza di m operazioni MakeSet, Union e FindSet delle quali n sono MakeSet, richiede tempo O(m + n log n). Dimostrazione. Tutte le operazioni richiedono un tempo costante eccetto Union che richiede un tempo costante più un tempo proporzionale al numero di puntatori al rappresentante che vengono modificati.

Il tempo richiesto dalla sequenza di m operazioni è quindi O(m + N) dove N è il numero totale di aggiornamenti dei puntatori al rappresentante eseguiti durante tutta la sequenza di operazioni. Il numero massimo di oggetti contenuti nella struttura è n, pari al numero di MakeSet. Quando un oggetto x viene creato esso appartiene ad un insieme di cardinalità 1.

Il rappresentante di x viene aggiornato quando l’insieme contenente x viene unito ad un insieme di cardinalità maggiore o uguale. Ogni volta che viene aggiornato il puntatore al rappresentante di x la cardinalità dell’insieme a cui appartiene x viene almeno raddoppiata. Siccome n è la massima cardinalità di un insieme il puntatore al rappresentante di x può essere aggiornato al più log2 n volte. Quindi N  n log2 n.

Rappresentazione con foreste Una rappresentazione più efficiente si ottiene usando foreste di insiemi disgiunti. Con questa rappresentazione ogni insieme è rappresentato con un albero i cui nodi, oltre al campo info che contiene l’informazione, hanno soltanto un campo p che punta al padre. Rappresentazione con foreste

b e h c g d f

Implementazione semplice: MakeSet(x) p[x]  x FindSet(x) while p[x]  x do x  p[x] return x Union(x,y) x  FindSet(x) y  FindSet(y) p[x]  y  serve controllare se x  y?

y b e h c g d f b e h c g d f x x y

Osservazione. Sia nella rappresentazione con liste circolari che nella rappresentazione mediante alberi non abbiamo indicato nessun puntatore esterno alla lista o all’albero. In realtà una struttura dati per insiemi disgiunti non è pensata per memorizzare dei dati ma soltanto per raggruppare in insiemi disgiunti dei dati che sono già memorizzati in qualche altra struttura (array, pila, albero, tavola hash, ecc.).

Complessità dell’implementazione semplice. - FindSet(x) : proporzionale alla lunghezza del cammino che congiunge il nodo x alla radice dell’albero. - Union : essenzialmente quella delle due chiamate FindSet(x) e FindSet(y). Un esempio analogo a quello usato con le liste mostra che una sequenza di n operazioni può richiedere tempo O(n2).

Possiamo migliorare notevolmente l’efficienza usando due euristiche: Unione per rango Simile all’unione pesata per le liste. Per ogni nodo x manteniamo un campo rank che è un limite superiore all’altezza del sottoalbero di radice x (e un limite inferiore del logaritmo del numero di nodi del sottoalbero). L’operazione Union inserisce la radice con rango minore come figlia di quella di rango maggiore.

Compressione dei cammini Quando effettuiamo una FindSet(x) dobbiamo attraversare tutto il cammino da x alla radice. Possiamo approfittarne per far puntare alla radice dell’albero i puntatori al padre di tutti i nodi incontrati lungo il cammino. In questo modo le eventuali operazioni FindSet successive sui nodi di tale cammino risulteranno molto meno onerose.

L’implementazione con le due euristiche è la seguente: MakeSet(x) p[x]  x rank[x]  0

FindSet(x) if p[x]  x then p[x]  FindSet(p[x]) return p[x] x x f f d c b h c h e g e g x b

Union(x,y) x  FindSet(x) y  FindSet(y) Link(x, y) Link(x, y) if rank[x] > rank[y] then p[y]  x else p[x]  y if rank[x] = rank[y] then rank[y]  rank[y] + 1