Estensione di strutture dati e
algoritmi Union-Find
Lezione n°9
Prof.ssa Rossella Petreschi
Lezione del 31/10/2012 del Corso di Algoritmi e Strutture Dati
Riferimenti:
•Capitolo 14,21 del testo Cormen, Leiserson, Rivest, Stein “Introduzione agli
algoritmi” Edizioni: Jackson Libri
•Capitolo 9 del testo Demetrescu, Finocchi, Italiano “Algoritmi e strutture dati”
Edizioni: McGraw-Hill
Estensione di una struttura dati
•
•
•
scelta della struttura dati di base;
determinazione dell’informazione aggiuntiva e verifica
che la stessa possa essere mantenuta attraverso le usuali
operazioni di modifica della struttura dati scelta;
sviluppo delle nuove operazioni.
Teorema di estensione su un AR bilanciato
Sia a il campo aggiuntivo che estende un AR bilanciato di n nodi.
Si supponga che il valore a, per ogni nodo x, possa essere calcolato
in tempo costante usando solo le info di x, fs(x) e fd(x).
a può essere mantenuta su tutto AR, per ogni sequenza di operazioni
senza modificare il tempo O(logn).
Intervalli
Un intervallo i è una coppia ordinata di numeri reali con estremo
sinistro, es(i)=t1 ed estremo destro ed(i)=t2
Intervallo chiuso: t1≤ t ≤ t2 e t in R
Qualsiasi coppia di intervalli i,i’soddisfa la proprietà di tricotomia
degli intervalli:
• o i ed i’ si sovrappongono;
• o ed(i) < es(i’)
• o ed(i’) < es(i)
Alberi di intervalli
Un albero di intervalli,AI, è un albero bilanciato dove ciascun nodo i memorizza un
intervallo i rappresentato come coppia ordinata (es(i), ed(i)).
Su un AI si esegue:
•
inserisci un intervallo;
•
elimina un intervallo;
•
ricerca, se esiste, un intervallo i nell’albero che si sovrapponga ad un dato
intervallo x
L’inserimento nell’albero avviene analizzando l’estremo sinistro e la visita inorder
fornisce gli intervalli ordinati rispetto all’estremo sinistro.
Estensione di alberi bilanciati
•
scelta della struttura dati di base:
alberi bilanciati (o AVL o red/black) dove ciascun nodo i memorizza un
intervallo i , [es(i), ed(i)];
•
determinazione dell’informazione aggiuntiva e verifica che la stessa possa
essere mantenuta attraverso le usuali operazioni di modifica della struttura
dati scelta:
max[i]: il più grande degli estremi destri degli intervalli memorizzati nel
sottoalbero radicato in i; max[i]= max[max[fs(i)], max[fd(i)], ed[i]];
•
sviluppo delle nuove operazioni:
ricerca (AR,x): a partire dalla radice e, al limite fino ad una foglia, confronta
se x si sovrappone all’ intervallo corrente. Se nessun confronto ha dato
risultato positivo anche dopo l’analisi della foglia, l’output sarà non trovato.
Ricerca(AR,x)
Ricerca(AR,x)
i = radice
Fintantoche inil e x non si sovrappone a int[i] ripeti
se fs(i) nil e max[fs(i)] ≥ es(x)
allora i = fs(i)
oppure i = fd(i)
ritorna i
Correttezza di Ricerca(AR,x)
La procedura Ricerca(AR,x) lavora correttamente.
Prova
Bisogna garantire che se i non esiste in c, cammino (fs/fd) scelto dopo un
confronto, allora i non può appartenere al cammino non scelto. Se dopo il
confronto
1.
2.
la ricerca procede a dx e fs(i) nil, ovvero max (fs(i)) < es(x),allora per ogni
i’ nel sottoalbero sinistro di i vale ed(i’) ≤ max (fs(i)) < es(x) e quindi, per la
tricotomia, i’ ed x non possono intersecarsi.
la ricerca procede a sx, ovvero max (fs(i)) ≥ es(x). Nel sottoalbero sinistro di
i  almeno un i’tale che ed(i’) = max (fs(i)) ≥ es(x). Per hip. i’ ed x non si
sovrappongono e quindi per la tricotomia ed(x) < es(i’). Per la struttura di AR
si ha ed(x) < es(i’) ≤ es(i’’), per ogni i’’ nel sottoalbero destro di i .
Union and find
La gestione dinamica ed efficiente di insiemi disgiunti (problematica
dello Union -Find) opera considerando una qualunque sequenza delle
seguenti tre operazioni:
• makesetx: creare un nuovo insieme x, di nome x, contenente un
nuovo elemento x;
• findx: dato un elemento x, restituire il nome dell’insieme che lo
contiene;
• unionA,B: dati due insiemi di nome A e B, costruire l’insieme
unione di nome A.
Notare che l’output dell’operazione union distrugge i due insiemi A e
B di input.
ASD-A.A.2011/2012
Alberi Quickfind
Un albero Quickfind è un albero di altezza 1che rappresenta un insieme i cui
elementi sono le foglie dell’albero. La radice contiene il nome dell’insieme.
Quindi, i costi delle tre operazioni base saranno:
• makesetx: O(1) perché richiede la creazione di un semplice albero con due
nodi;
• findx: O(1) perché è sufficiente restituire il nome del nodo radice, nodo
identificato dal puntatore dal nodo foglia x al nodo padre,radice;
• unionA,B: O(n) perché aggancia tutte le foglie di B ad A,quindi union
dipende dalla cardinalità di B che può essere dell’ordine di n, numero totale di
elementi in AB
L’occupazione totale di memoria della struttura dati è O(n) in qualunque istante
della sequenza delle operazioni.
ASD-A.A.2011/2012
Alberi Quickunion
Un albero Quickunion è un albero di altezza qualunque che rappresenta un
insieme i cui elementi sono i nodi dell’albero, radice compresa.
Quindi, i costi delle tre operazioni base saranno:
• makesetx: O(1) perché richiede la creazione di un semplice albero
composto da un solo nodo contenente x, che rappresenta sia il nome del nodo
che quello dell’albero;
• uniona,b: O(1) perché rende la radice dell’albero B (contenente il nodo b)
figlia della radice dell’albero A (contenente il nodo a);
• findx: O(n) perché restituisce la radice dell’albero contenente x.
L’occupazione totale di memoria della struttura dati è O(n) in qualunque
istante della sequenza delle operazioni.
ASD-A.A.2011/2012
Alberi Quickfind bilanciati
unionA,B: aggancia le foglie dell’albero di cardinalità minore alla radice
dell’albero di cardinalità maggiore. Nella radice sono memorizzati nome e
cardinalità dell’albero.
Siano Tp e Td i due alberi quickfind bilanciati a cui appartiene una foglia f
prima e dopo una operazione di union. La cardinalità dell’albero Td è almeno
il doppio della cardinalità dell’albero Tp. (size (A)+size(B) ≥ 2size(Tp))
O(m+nlogn) è il tempo totale necessario per eseguire su un albero quickfind
bilanciato una sequenza di:
m operazioni find,
n operazioni makeset,
al più (n-1)operazioni union.
ASD-A.A.2011/2012
perché O(m+nlogn)?
Un nuovo albero, x, creato in tempo O(1), ha cardinalità 1. Ogni volta che la foglia x
cambia padre, la dimensione dell’albero a cui appartiene per lo meno
raddoppia:2,4,8……, quindi dopo k cambi di “paternità”, x si troverà in un albero di
cardinalità almeno 2k.
Poiché dopo k cambi di “paternità”, al termine della sequenza di operazioni, x potrà
trovarsi in un albero di cardinalità al più n (n numero di makeset), ne segue che 2k ≤ n,
ovvero che una foglia può al più subire log2n cambiamenti.
Riassumendo:
le operazioni di find e di makeset hanno costo costante, m dell’una e n dell’altra
richiedono pertanto tempo 0(m+n). Le (n-1)operazioni union richiedono che al più tutte
le n foglie subiscano il massimo dei cambiamenti possibili, ovvero O(nlog2n), da cui una
sequenza di m operazioni find, n operazioni makeset e (n-1) operazioni union richiederà
un tempo dell’ordine O(m+n) + O(nlog2n) = O(m + nlog2n).
ASD-A.A.2011/2012
Alberi Quickunion bilanciati
unionA,B: rende la radice dell’albero più basso figlia della radice dell’albero
più alto.
La radice dell’albero risultante conterrà sia il nome del nuovo albero (p.e. A)
che la sua altezza (rank(A)).
Durante una sequenza di operazioni makeset, union e find, l’altezza di un
albero QuickUnion bilanciato è limitata superiormente da log2 n dove n è il
numero totale di makeset.
Prova:
Siano T un albero QuickUnion bilanciato di radice x e dimensione size(x) ≤ n.
Poiché size(x) ≥ 2rank(x) si ha che rank(x) ≤ log2n.
ASD-A.A.2011/2012
size(x) ≥ 2rank(x)
Si dimostra per induzione analizzando le differenti operazioni effettuate.
Makeset(x).: costruisce un albero di altezza 0 con rank(x) = 0 e non modifica nessun
albero preesistente, quindi : 2rank(x) = 20 =1.
Find(x).: non modifica nulla del preesistente.
Union(A,B).:
• Rank(B) < Rank(A), ovvero Rank(A∪B)= Rank(A) da cui
⎜A∪B⎜ = ⎜A⎜ + ⎜B⎜ ≥ 2 Rank(A) + 2 Rank(B) > 2 Rank(A) = 2 Rank(A∪B)
• Rank(A) < Rank(B) , ovvero Rank(A∪B)= Rank(B) da cui
⎜A∪B⎜ = ⎜A⎜ + ⎜B⎜ ≥ 2 Rank(A) + 2 Rank(B) > 2 Rank(B) = 2 Rank(A∪B)
• Rank(A) = Rank(B) , ovvero Rank(A∪B)= Rank(A) + 1 da cui
⎜A∪B⎜ = ⎜A⎜ + ⎜B⎜ ≥ 2 Rank(A) + 2 Rank(B) ≥ 2.2 Rank(A) = 2 Rank(A)+1 = 2 Rank(A∪B)
ASD-A.A.2011/2012
Tempo O(n + mlogn)
O(n+mlogn) è il tempo totale necessario per eseguire su un albero quickunion
bilanciato una sequenza di:
m operazioni find,
n operazioni makeset,
al più (n-1)operazioni union.
Deriva dal fatto che rank(x)≤logn
ASD-A.A.2011/2012