Strutture Merge-Find Moreno Marzolla

Slides:



Advertisements
Presentazioni simili
Metodologia Sperimentale Agronomica / Metodi Statistici per la Ricerca Ambientale Marco Acutis a.a CdS.
Advertisements

I circuiti elettrici.
IL GOLD STANDARD: INTRODUZIONE
XXXII CONVEGNO NAZIONALE Società Italiana di Chimica Agraria
Il problema dello zaino
Campi di gravità e topografia: analisi con QGIS
Regole associative Gianluca Amato
Ciclo di Seminari e Corso
Valutazione dei risultati della classificazione
Generalità Laboratorio Arduino.
Natura e origini della attuale crisi europea
ECONOMIA DELLE ISTITUZIONI FINANZIARIE
Stato di COMPASS Franco Bradamante CSN1 Roma, 16 luglio 2012.
La struttura dei materiali
ESSERE HOMELESS: PERCORSI DI VITA E FATTORI DETERMINANTI
Introduzione a VPN Ing. Gianpiero Ciacci.
Le verifiche empiriche del teorema di Heckscher-Ohlin: il paradosso di Leontief Wassily Leontief realizzò la prima verifica empirica del teorema di HO.
…. modello di Solow?.
Politica economica: che cosa è?
 π BUZZO GIACOMO D’AGOSTINO ALBERTO DE ANGELIS FEDERICA
“BLAISE PASCAL”- Voghera-
La vitamina C è una molecola contenente C,H e O
REDDITO DI CITTADINANZA E OPPORTUNITA’ ECONOMICA: UN CONFRONTO TRA ITALIA E RESTO D’EUROPA Pasquale Tridico Dipartimento di Economia, Università Roma Tre.
Classificazione e Predizione
L’economia monetaria Corso di Economia delle Istituzioni Finanziarie
L’infiltrazione LM-75: 2016/2017
UN NUOVO MODO DI GUARDARE IL MONDO
LA PREVENZIONE INCENDI NELLE STRUTTURE RELIGIOSE APERTE AL PUBBLICO
LE NOVITÀ DEL BILANCIO 2016 …………………………………………………………………………………………………………..
Le unità territoriali per le analisi socio-economiche
Pompe di calore a integrazione geotermica
ISTITUZIONI (regole scritte e nn scritte che governano l’interazione tra individui) → d.p. e contratti → norme sociali con appropriati Δ delle regole.
Università di Roma Tor Vergata
Convegno europeo sui minori
ATIPICITA’ DEL FATTORE UMANO NEL PILOTAGGIO DEI DRONI
CALENDARIO LEZIONI AGGIORNATO
RAEE è l’acronimo di Rifiuti da Apparecchiature Elettriche ed Elettroniche; ogni elettrodomestico ha un ciclo di vita terminato il quale, sia per malfunzionamento.
Appunti per ostetriche e non solo
Ricerca e innovazione:
Pubblica Amministrazione: semplificazione e costi della politica
Il processo di analisi dei fabbisogni
Comunicazioni Assemblea nazionale TTA 1-2 dicembre 2016
Proactive Care e Proactive Care Advanced
Maria Antonietta Volonté Dipartimento di Neurologia
IL CONFLITTO NELLA CHIESA PRIMITIVA
Piano di formazione Docenti neoassunti a.s. 2016/2017
È possibile rendere comprensibile oggi questo termine filosofico, al di fuori della esigua cerchia degli specialisti? Io una volta ci ho provato in una.
ACCORDO AGROAMBIENTALE D’AREA OPPORTUNITA’ PER LA VALDASO
Il secondo principio.
PROGETTO RELAZIONI PREPOTENTI
Vitamine Sono sostanze organiche a basso peso molecolare strutturalmente assai varie indispensabili per lo svolgimento delle funzioni vitali, di origine.
La misurazione e la valutazione della performance
1.2 Nuovi prodotti alimentari
ASSOCIAZIONE ITALIANA GIURISTI DI IMPRESA
L’evoluzione del Diritto delle Assicurazioni Continuità o rottura con il passato? Avv. Giuseppe Ranieri Studio Legale Tributario Ranieri Comitato Esecutivo.
ADOZIONE INTERNAZIONALE
Esame delle modifiche apportate al precedente ordinamento
e l’associazione in partecipazione
Profilo biografico e opere
IL TOTALITARISMO.
L’Imposta sul reddito delle società (IRES)
Asl Vco – Direzione Generale
Assunzioni, Attività, Investimenti
UROLOGIA - RIMINI VISITE UROLOGICHE AMBULATORIALI REGIME RICOVERO
Endometriosi profonda: quando la chirurgia
Nota AIFA 75 Determinazione 18 novembre 2010 (GU 29 novembre 2010, n. 279): modifiche, con riferimento alla nota AIFA 75,  alla determinazione del 4 gennaio.
PIANO DI RIORDINO PRESIDI DI FOLIGNO E SPOLETO
SINTOMI DEL BASSO APPARATO URINARIO 4 MARZO 2017
Con gli occhi di Maxwell
Transcript della presentazione:

Strutture Merge-Find Moreno Marzolla Dipartimento di Informatica—Scienza e Ingegneria Università di Bologna moreno.marzolla@unibo.it http://www.moreno.marzolla.name/

Copyright © 2009—2016 Moreno Marzolla, Università di Bologna, Italy Copyright © Alberto Montresor, Università di Trento, Italy (http://www.dit.unitn.it/~montreso/asd/index.shtml) Copyright © 2009—2016 Moreno Marzolla, Università di Bologna, Italy (http://www.moreno.marzolla.name/teaching/ASD/) This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. Strutture Merge-Find

Struttura dati per insiemi disgiunti Operazioni fondamentali: Creare n insiemi composti da un singolo elemento; assumiamo che gli insiemi siano {1}, {2}, … {n} Unire due insiemi Identificare l'insieme a cui appartiene un elemento Ogni insieme è identificato da un rappresentante univoco Il rappresentante è un qualsiasi membro dell’insieme Operazioni di ricerca del rappresentante su uno stesso insieme devono restituire sempre lo stesso elemento Solo in caso di unione con altro insieme il rappresentante può cambiare Strutture Merge-Find

Operazioni su strutture Merge-Find Mfset(integer n) Crea n insiemi disgiunti {1}, {2}, … {n} integer find(integer x) Restituisce il rappresentante dell’unico insieme contenente x merge(integer x, integer y) Unisce i due insiemi che contengono x e y (se x e y appartengono già allo stesso insieme, non fa nulla) Il rappresentante puo' essere scelto in modo arbitrario; ad esempio, come uno dei vecchi rappresentanti degli insiemi contenenti x e y. Strutture Merge-Find

Esempio (i valori sottolineati indicano il rappresentante) Mfset(6) 1 2 3 4 5 6 merge(1,2) 1, 2 3 4 5 6 merge(3,4) 1, 2 3, 4 5 6 merge(5,6) 1, 2 3, 4 5, 6 merge(2,3) 1, 2, 3, 4 5, 6 merge(4,6) 1, 2, 3, 4, 5, 6 Strutture Merge-Find

Un esempio di applicazione Strutture Merge-Find

Un esempio di applicazione Strutture Merge-Find

Un esempio di applicazione Strutture Merge-Find

Un esempio di applicazione Rappresentiamo il circuito con un insieme V = {1, ..., n} di n nodi (pin) collegati da segmenti conduttivi Indichiamo con E la lista di coppie (v1, v2) di pin che sono tra di loro adiacenti (collegati) Vogliamo pre-processare il circuito in modo da rispondere in maniera efficiente a interrogazioni del tipo: “i pin x e y sono tra loro collegati?” Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio Insieme E = {1, 4} {3, 6} {8, 9} {2, 5} {4, 5} {6, 9} {4, 7} 1 Strutture Merge-Find

Esempio I pin x e y non sono tra loro collegati perché 1 2 3 I pin x e y non sono tra loro collegati perché find(x) ≠ find(y) 4 5 6 7 8 9 y Strutture Merge-Find

Esempio I pin x e y sono tra loro collegati perché find(x) = find(y) x 1 2 3 I pin x e y sono tra loro collegati perché find(x) = find(y) 4 5 6 7 8 9 y Strutture Merge-Find

Esempio Mfset MF ← Mfset(n); for each (v, w) Î E do MF.merge(v, w); endfor integer x ← ... ; integer y ← ... ; if ( MF.find(x) = MF.find(y) ) then print “x e y sono collegati”; else print “x e y non sono collegati”; endif Strutture Merge-Find

Implementazione di Merge-Find Strutture dati di base: Strutture QuickFind: liste (alberi di altezza 1) Strutture QuickUnion: alberi generali Algoritmi basati su euristiche di bilanciamento QuickFind—Euristica sul peso QuickUnion—Euristica sul rango Strutture Merge-Find

QuickFind Strutture Merge-Find

QuickFind Ogni insieme viene rappresentato (concettualmente) con un albero di altezza uno Le foglie dell'albero contengono gli elementi dell'insieme Il rappresentante è la radice 1 2 1 2 3 4 5 {1} {2, 3, 4, 5} Strutture Merge-Find

Implementazione Generalmente si rappresentano gli insiemi QuickFind con strutture concatenate simili a liste Count head 1 tail head 4 tail Parent 1 2 3 4 5 Info Next Strutture Merge-Find

QuickFind: Esempio merge(3,2) 1 5 1 3 4 6 5 2 7 1 5 1 3 4 6 5 2 7 Strutture Merge-Find

QuickFind Mfset(n) Crea n liste, ciascuna contenente un singolo intero Costo O(n) find(x) Restituisce il riferimento al rappresentante di x Costo O(1) merge(x,y) Tutti gli elementi della lista contenente y vengono spostati nella lista contenente x Costo nel caso pessimo O(n), essendo n il numero complessivo di elementi in entrambi gli insiemi disgiunti Nel caso peggiore l'insieme contenente y ha n - 1 elementi Strutture Merge-Find

QuickUnion Strutture Merge-Find

QuickUnion Implementazione basata su foresta Si rappresenta ogni insieme con un albero radicato generico Ogni nodo contiene un intero un riferimento al padre (la radice è padre di se stessa) Il rappresentante di un insieme è la radice dell'albero corrispondente 1 4 2 5 3 6 7 {1, 2, 5, 6} {3, 4, 7} Strutture Merge-Find

QuickUnion Mfset(n) Crea n alberi, ciascuno contenente un singolo intero Costo O(n) find(x) Risale la lista degli antenati di x fino a trovare la radice e ne ritorna il contenuto come rappresentante Costo O(n) nel caso pessimo merge(x,y) Rende la radice dell'albero che contiene y figlia della radice dell'albero che contiene x Costo O(1) nel caso ottimo (x e y sono già le radici dei rispettivi alberi), O(n) nel caso pessimo Strutture Merge-Find

QuickUnion: Esempio merge(2,7) 1 4 1 2 5 3 2 5 4 6 7 6 3 {1, 2, 5, 6} {3, 4, 7} 7 {1, 2, 3, 4, 5, 6, 7} Strutture Merge-Find

QuickUnion: Esempio merge(2,7) 1 4 2 1 6 5 3 6 4 5 7 3 {2, 6} {1, 5} {3, 4, 7} 7 {2, 3, 4, 6, 7} {1, 5} Strutture Merge-Find

Caso pessimo per find() Mfset(6) 1 2 3 4 5 6 merge(5,6) 1 2 3 4 5 6 merge(4,5) 1 2 3 4 5 merge(3,4) ... 1 2 3 6 4 5 6 Strutture Merge-Find

Il padre del nodo i è il nodo p[i] Nota implementativa Un modo molto comodo per rappresentare una foresta di alberi QuickUnion è di usare un array di interi (vettore di padri) 1 4 1 2 3 4 5 6 7 i 1 1 4 4 1 2 3 p[i] 2 5 3 6 7 Il padre del nodo i è il nodo p[i] Strutture Merge-Find

Implementazione Java public class QuickUnion { private int[] p; public QuickUnion(int n) { p = new int[n]; for (int i = 0; i < n; i++) { p[i] = i; } private int find(int x) { while (x != p[x]) { x = p[x]; return x; public void merge(int x, int y) { int rx = find(x); int ry = find(y); p[ry] = rx; Strutture Merge-Find

Costo delle operazioni QuickFind QuickUnion Mfset(n) O(n) merge(x,y) O(1) caso ottimo O(n) caso pessimo find(x) O(1) Quando usare QuickFind? Quando le merge() sono rare e le find() frequenti Quando usare QuickUnion? Quando le find() sono rare e le merge() frequenti Esistono euristiche che permettono di migliorare questi risultati Strutture Merge-Find

Ottimizzazioni Strutture Merge-Find

QuickFind: Euristica sul peso Una strategia per diminuire il costo dell’operazione merge() in QuickFind consiste nel: memorizzare nel nodo rappresentante il numero di elementi dell'insieme; la dimensione corretta può essere mantenuta in tempo O(1) appendere l'insieme con meno elementi a quello con più elementi merge(3,2) 1 5 1 5 1 3 4 6 5 2 7 1 3 4 6 5 2 7 Strutture Merge-Find

QuickFind: Euristica sul peso Mfset(n) Costo O(n) find(x) Costo O(1) merge(x,y) Tutte i nodi della lista con meno nodi vengono spostati nella lista con più nodi Dimostriamo che il costo complessivo di una sequenza di (n - 1) merge è O(n log n) Quindi il costo ammortizzato per una singola operazione è O(log n) Strutture Merge-Find

Intuizione Ogni volta che una foglia di un albero QuickFind cambia padre, entra a far parte di un insieme che ha almeno il doppio di elementi di quello cui apparteneva 1 elemento Strutture Merge-Find

Intuizione Ogni volta che una foglia di un albero QuickFind cambia padre, entra a far parte di un insieme che ha almeno il doppio di elementi di quello cui apparteneva 2 elementi Strutture Merge-Find

Intuizione Ogni volta che una foglia di un albero QuickFind cambia padre, entra a far parte di un insieme che ha almeno il doppio di elementi di quello cui apparteneva 4 elementi Strutture Merge-Find

Intuizione Ogni volta che una foglia di un albero QuickFind cambia padre, entra a far parte di un insieme che ha almeno il doppio di elementi di quello cui apparteneva 8 elementi Strutture Merge-Find

Dimostrazione Ogni volta che una foglia di un albero QuickFind cambia padre, entra a far parte di un insieme che ha almeno il doppio di elementi di quello cui apparteneva merge(A, B) con size(A) ≥ size(B) Le foglie di B cambiano padre size(A) + size(B) ≥ size(B) + size(B) = 2 ´ size(B) merge(A, B) con size(A) ≤ size(B) Le foglie di A cambiano padre size(A) + size(B) ≥ size(A) + size(A) = 2 ´ size(A) Strutture Merge-Find

Costo delle operazioni Le strutture QuickFind supportano una operazione Mfset(n), m operazioni find(), ed al più (n - 1) merge() in tempo totale O(m + n log n). L'occupazione di memoria è O(n) Dimostrazione Mfset(n) ed m find() costano O(n + m) Le (n - 1) merge() richiedono complessivamente O(n log n) Strutture Merge-Find

Costo delle operazioni merge Il costo di una singola merge() è dato dal numero di nodi che cambiano padre Ogni volta che un elemento cambia padre, entra a far parte di un insieme con almeno il doppio di elementi di quello cui faceva parte Dopo k merge() fa parte di un insieme con almeno 2k elementi Quindi ci possono essere O(log2 n) cambi di paternità per ciascun elemento Il costo totale dell'intera sequenza di merge() è quindi O(n log n) Strutture Merge-Find

Domanda Si consideri una struttura QuickFind con euristica sul peso composta inizialmente da 8 insiemi {1}, {2}, ..., {8}. Descrivere una sequenza di merge() che alla fine producano un singolo albero, e tali che il costo totale di tutte le merge() sia il minimo possibile. Ripetere l'esercizio identificando una sequenza di operazioni merge() il cui costo totale sia massimo possibile. Per ottenere il costo massimo: merge(1, 2), merge(3, 4), merge(5, 6), merge(7, 8), merge(1,3), merge(5, 7) e infine merge(1, 5); Per ottenere il costo minimo: merge(1,2), merge(1,3) merge(1,4), … merge(1,8) Strutture Merge-Find

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 cioè l'altezza dell'albero radicato in x Strutture Merge-Find

A B merge(A, B) A B A B merge(A, B) A B A B merge(A, B) B A rango unione := rank(A)+1 A B merge(A, B) A B rango unione := rank(A) A B merge(A, B) A B rango unione := rank(B) A B merge(A, B) B A Strutture Merge-Find

Esempio Mfset(6) 1 2 3 4 5 6 merge(5,6) 1 2 3 4 5 6 merge(4,5) 1 2 3 5 Strutture Merge-Find

Proprietà union by rank Un albero QuickUnion con euristica “union by rank” avente il nodo x come radice ha ≥ 2rank(x) nodi Dimostrazione: induzione sul numero di merge() effettuate Base (0 operazioni merge): tutti gli alberi hanno rango zero (singolo nodo) quindi hanno esattamente 20 = 1 nodi Induzione: consideriamo cosa succede prima e dopo una operazione merge(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 Strutture Merge-Find

Passo induttivo caso rank(A) = rank(B) merge(A, B) B |A U B| = |A| + |B| rank(A U B) = rank(A) +1 Per ipotesi induttiva, |A| ≥ 2rank(A), |B| ≥ 2rank(B) Quindi ∣𝐴∪𝐵∣=∣𝐴∣+∣𝐵∣ ≥ 2 𝑟𝑎𝑛𝑘 𝐴 + 2 𝑟𝑎𝑛𝑘 𝐵 =2× 2 𝑟𝑎𝑛𝑘 𝐴 = 2 𝑟𝑎𝑛𝑘 𝐴 +1 = 2 𝑟𝑎𝑛𝑘 𝐴∪𝐵 Strutture Merge-Find

Passo induttivo caso rank(A) > rank(B) merge(A, B) 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| ≥ 2rank(A), |B| ≥ 2rank(B) Quindi ∣𝐴∪𝐵∣=∣𝐴∣+∣𝐵∣≥ 2 𝑟𝑎𝑛𝑘 𝐴 + 2 𝑟𝑎𝑛𝑘 𝐵 > 2 𝑟𝑎𝑛𝑘 𝐴 = 2 𝑟𝑎𝑛𝑘 𝐴∪𝐵 Strutture Merge-Find

Passo induttivo caso rank(A) < rank(B) merge(A, B) A |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| ≥ 2rank(A), |B| ≥ 2rank(B) Quindi ∣𝐴∪𝐵∣=∣𝐴∣+∣𝐵∣≥ 2 𝑟𝑎𝑛𝑘 𝐴 + 2 𝑟𝑎𝑛𝑘 𝐵 > 2 𝑟𝑎𝑛𝑘 𝐵 = 2 𝑟𝑎𝑛𝑘 𝐴∪𝐵 Strutture Merge-Find

Teorema Durante una sequenza di operazioni merge() e find(), l'altezza di un albero QuickUnion by rank è ≤ (log2 n), essendo n il parametro della Mfset(n) iniziale Dimostrazione L'altezza di un albero QuickUnion A è rank(A) Da quanto appena visto, 2rank(A) ≤ n Quindi altezza = rank(A) ≤ (log2 n) Quindi: Mfset(n) ha costo O(n) merge() ha costo O(1) nel caso ottimo O(log n) nel caso pessimo, vedi punto seguente) find() ha costo O(log n) nel caso pessimo Strutture Merge-Find

Riepilogo QuickFind QuickUnion Mfset(n) O(n) merge O(1) ottimo QuickFind bilanciato QuickUnion by rank Mfset(n) O(n) merge O(1) ottimo O(n) pessimo O(log n) ammortizzato O(log n) pessimo find O(1) Strutture Merge-Find