14
AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

Embed Size (px)

Citation preview

Page 1: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Insiemi disgiunti

Laboratorio di Algoritmi 02/03

Prof. Ugo de’ Liguoro

Page 2: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Partizioni

Def. Una partizione (finita) di un’insieme S è un sottoinsieme {S1, …, Sk} (S) t.c.

1. S = S1 … Sk

2. se i j allora Si Sj =

Ai fini pratici è conveniente identificare ciascun elemento non vuoto Si della partizione con un suo elemento a Si, detto rappresentante canonico di Si.

Page 3: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

L’ADT Disjoint-set

datatype Disjoint_Set, Set, T;constructors: Create: Set -> Disjoint_Set; Union: Disjoint_set,T,T -> Disjoint_Set; observation: Find: Disjoint_Set,T -> T;

semantics: Create(S) ritorna la partizione P di S t.c. ogni elemento di P e' un singoletto Union(P,x,y) ritorna la partizione che si ottiene da P rimpiazzando gli insiemi di cui x e y sono rappresentanti con la loro unione Find(P,a) ritorna il rappresentante dell’elemento di P cui a appartiene (pre: a in Unione(P))

Page 4: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Realizzazione con liste

{ {a, b, c, d} , {e, f, g} }

a b c d

e f ge S2

a S1

Page 5: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Analisi dei costi

Dopo q unioni su una struttura di n nodi:1. Create è (n)

2. Union è (q2) ovvero

i=1q-1 i = (q2)

Posto m = n + q, essendo n = (m) e q = (m) il tempo richiesto è (m2) (il tempo ammortizzato di un’operazione è dunque (m)).

Page 6: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Realizzazione con foreste

a

b d

c

e

f

g

P = {{a, b, c, d} , {e, f, g}}

a S1 e S2

Page 7: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Unione

e

f

g

Union(P, a, e) = {{a, b, c, d, e, f, g}}

a

b d

c

a

b d

c

e

f

g

Page 8: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Euristiche: unione per peso

Def. Sia T il sottoalbero con root(T) = x:

weight(x) = card(T), rank(x) = height(T).

Euristica Unione-per-peso:

Link(x, y) se weight(x) weight(y)

Union(P, x, y) =

Link(y, x) altrimenti

Dove

x

yLink(x, y) =

Page 9: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Nuova analisi di Find (1)

Teorema. Se Union è implementata con l’euristica Unione-per-peso, allora per ogni x:

2rank(x) weight(x),

quindi se n = card(T) con root(T) = x, allora rank(x) lg n, ossia Find è (lg n).

Dim. Per induzione sulle chiamate successive di Union.

Denotiamo con rank(n, x) = rank(x) dopo n applicazioni di Union alla partizione discreta (tutti singoletti); analogamente weight(n, x), Union(n, x, y) e height(n, x): facciamo dunque induzione su n.

Page 10: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Nuova analisi di Find (2)

Base: se n = 0 allora rank(n, x) = 0, e 20 = 1 = weight(n, x);

Passo: supponiamo che weight(n, x) > weight(n, y) per cui

Union(x, y) = Link(y, x); due sottocasi:

a) height(n, x) > height(n, y): allora rank(n+1,x) = rank(n,x)

b) height(n, x) = height(n, y): allora

rank(n+1, x) = rank(n, y) + 1

2rank(n+1,x) = 2rank(n,y)+1

= 2rank(n,y) + 2rank(n,y)

weight(n, y) + weight(n, y) (ip. ind.)

weight(n, x) + weight(n, y)

= weight(n+1, x)

Page 11: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Euristiche: unione per rango

Euristica Unione-per-rango:

Link(x, y) se rank(x) rank(y)

Union(P, x, y) =

Link(y, x) altrimenti

Si può dimostrare che anche con questa euristica Find è (lg n).

Link-by-rank (x, y)

1. if rank[x] > rank[y]

2. then parent[y] := x

3. else parent[x] := y

4. if rank[x] = rank[y]

5. then rank[y] := rank[y] + 1

Page 12: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Euristiche: compressione del cammino

Euristica: nel calcolare Find(P, a), rendiamo ogni vertice incontrato sul cammino da a alla radice dell’albero cui appartiene, figlio di questa radice.

ab

cd

a b c

d

Nota: Un confine superiore all’analisi ammortizzata di m operazioni su un insieme di n elementi è O(m lg* n).

Page 13: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Page 14: AlgoLab - Insiemi disgiunti Insiemi disgiunti Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro

AlgoLab - Insiemi disgiunti

Realizzazione in Java