Sunteți pe pagina 1din 80

Proiectarea Algoritmilor

Curs 9 Drumuri de cost minim


(continuare) Algoritmul lui Johnson
Arbori minimi de acoperire
Proiectarea Algoritmilor 2010
Bibliografie
[1]
http://monalisa.cacr.caltech.edu/monalisa__Service_Applications_
_Monitoring_VRVS.html

[2]
http://www.cobblestoneconcepts.com/ucgis2summer2002/guo/guo.
html

[3] Giumale Introducere in Analiza Algoritmilor cap. 5.5

[4] R. Sedgewick, K Wayne curs de algoritmi Princeton 2007
www.cs.princeton.edu/~rs/AlgsDS07/ 01UnionFind si 14MST

[5] http://www.pui.ch/phred/automated_tag_clustering/

[6] Cormen Introducere n Algoritmi cap. 24
Proiectarea Algoritmilor 2010
Planul cursului
Drumuri optime multipunct-multipunct:
Reminder Dijkstra, Bellman-Ford, Floyd-Warshal;
Algoritmul lui Johnson.

Arbori minimi de acoperire:
Definiie;
Utilizare;
Algoritmi.

Operaii cu mulimi disjuncte:
Structuri de date pentru reprezentarea mulimilor
disjuncte;
Algoritmi pentru reuniune si cutare;
Calcul de complexitate.
Proiectarea Algoritmilor 2010
Reminder Dijkstra
Dijkstra(G,s)
Pentru fiecare (u e V)
d[u] = ; p[u] = null;
d[s] = 0;
Q = construiete_coada(V) // coad cu prioriti
Ct timp (Q != C)
u = ExtrageMin(Q); // extrage din V elementul cu d[u] minim
// Q = Q - {u} se execut n cadrul lui ExtrageMin
Pentru fiecare (v e Q i v din succesorii lui u)
Dac (d[v] > d[u] + w(u,v))
d[v] = d[u] + w(u,v) // actualizez distana
p[v] = u // i printele
Complexitate?
Vectori - O(V
2
)
HB - O(E logV)
HF - O(V log V+E)
Proiectarea Algoritmilor 2010
Reminder Bellman-Ford
BellmanFord(G,s) // G=(V,E),s=sursa
Pentru fiecare v din V // iniializri
d[v] = ;
p[v] = null;
d[s] = 0; // actualizare distan de la s la s
Pentru i de la 1 la |V| -1 // pentru fiecare pas pornind din s
// spre restul nodurilor se ncearc construcia unor drumuri
// optime de dimensiune i
Pentru fiecare (u,v) din E // pentru arcele ce pleac de la nodurile
// deja considerate
Dac d[v] > d[u] + w(u,v) atunci // se relaxeaz arcele corespunztoare
d[v] = d[u] + w(u,v);
p[v] = u;
Pentru fiecare (u,v) din E
Dac d[v] > d[u] + w(u,v) atunci
Eroare (ciclu negativ);
Complexitate?
O(VE)
Proiectarea Algoritmilor 2010
Reminder Roy-Floyd
Algoritm prin care se calculeaz distanele minime
ntre oricare 2 noduri dintr-un graf (drumuri optime
multipunct-multipunct).

Exemplu clasic de programare dinamic.

Idee: la pasul k se calculeaz cel mai bun cost ntre u
i v folosind cel mai bun cost u..k i cel mai bun cost
k..v calculat pn n momentul respectiv.

Se aplic pentru grafuri ce nu conin cicluri de cost
negativ.
Proiectarea Algoritmilor 2010
Reminder Floyd-Warshall
Floyd-Warshall2(G)
Pentru i de la 1 la n
Pentru j de la 1 la n // iniializri
d(i,j) = w(i,j)
Dac (w(i,j) == )
p(i,j) = null;
Altfel p(i,j) = i;
Pentru k de la 1 la n
Pentru i de la 1 la n
Pentru j de la 1 la n
Dac (d(i,j) > d(i,k) + d(k,j)) // determinm minimul
d(i,j) = d(i,k) + d(k,j)
p(i,j) = p(k,j); // i actualizm printele
Complexitate?
O(V
3
)
Complexitate
spaial?
O(V
2
)
Proiectarea Algoritmilor 2010
Algoritmul lui Johnson
Pentru grafuri rare.

Folosete liste de adiacen.

Bazat pe Dijkstra i Bellman-Ford.

Complexitate: O(V
2
logV + VE)
Mai bun dect Floyd-Warshall pentru
grafuri rare.
Proiectarea Algoritmilor 2010
Idee algoritm Johnson
Dac graful are numai arce pozitive:
se aplic Dijkstra pentru fiecare nod cost
V
2
logV + VE.
Altfel se calculeaz costuri pozitive
pentru fiecrui arc meninnd
proprietile:
w
1
(u,v) 0, (u,v) e E;
p este drum minim utiliznd w p este
drum minim utiliznd w
1
.
Proiectarea Algoritmilor 2010
Construcie w
1
(I)

Idee 1: identificare arcul cu cel mai mic
cost c; adunare la costul fiecrui arc
valoarea c;

a
b
c
d
5
3
8
-7
a
b
c
d
12
10
15
0
cost(a..b..d) > cost(a,d)
cost(a..b..d) < cost(a,d)
Nu funcioneaz!!!!
Proiectarea Algoritmilor 2010
Construcie w
1
(II)

Idee 2: w
1
(u,v) = w(u,v) + h(u) - h(v);

unde h : V 9;

se adaug un nod s;

se unete s cu toate nodurile grafului prin arce de
cost 0;

se aplic BF pe acest graf => h(v) = (s,v);

w
1
(u,v) = w(u,v) + h(u) - h(v).
Proiectarea Algoritmilor 2010
Algoritm Johnson
Johnson(G)
G = (V,E);
V = V {s}; // adugm nodul s
E = E (s,u), ueV; w(s,u) = 0; // i l legm de toate nodurile
Dac BF(G) e fals // aplic BF pe G
Eroare ciclu negativ
Altfel
Pentru fiecare v e V
h(v) = (s,v); // calculat prin BF
Pentru fiecare (u,v) e E
w
1
(u,v) = w(u,v) + h(u) - h(v) // calculez noile costuri pozitive
Pentru fiecare (u e V)
Dijkstra(G,w
1
,u) // aplic Dijkstra pentru fiecare nod
Pentru fiecare (v e V)
d(u,v) =
1
(u,v) + h(v) - h(u) // calculez costurile pe graful iniial
Proiectarea Algoritmilor 2010
Exemplu (I)
1
2
3
4 5
3
8
4
1
2
7
-4
6
-5
Adaug s i
aplic BF pe
noul graf.
1
2
3
4 5
3
8
4
1
2
7
-4
6
-5
s
0
0
0
0
0
0
-4
0
-5
-1
0
BellmanFord(G,s) // G=(V,E),s=sursa
Pentru fiecare v din V // iniializri
d[v] = ; p[v] = null;
d[s] = 0; // actualizare distan de la s la s
Pentru i de la 1 la |V| -1 // se construiesc drumuri optime de dimensiune i
Pentru fiecare (u,v) din E // pentru arcele ce pleac de la nodurile deja considerate
Dac d[v] > d[u] + w(u,v) atunci // se relaxeaz arcele corespunztoare
d[v] = d[u] + w(u,v); p[v] = u;
Pentru fiecare (u,v) din E
Dac d[v] > d[u] + w(u,v) atunci
Eroare (ciclu negativ);

Proiectarea Algoritmilor 2010
Exemplu (II)
w
1
(u,v) = w(u,v) + h(u) - h(v)
1
2
3
4 5
4
13
0
0
2
10
0
2
0
s
1
5
0
4
0
0
-4
0
-5
-1
0
1
2
3
4 5
3
8
4
1
2
7
-4
6
-5
s
0
0
0
0
0
0
-4
0
-5
-1
0
Proiectarea Algoritmilor 2010
Exemplu (III)
1
2
3
4 5
4
13
0
0
2
10
0
2
0
0/0
0/-4 2/4
2/-3
2/1
Aplicm Dijkstra din fiecare nod (
1
(u,v)).
Refacem distanele:
d(u,v) =
1
(u,v) + h(v) - h(u)
Eliminm s
1
2
3
4 5
4
13
0
0
2
10
0
2
0
s
1
5
0
4
0
0
-4
0
-5
-1
0
Exemplu (IV)
Proiectarea Algoritmilor 2010
1
2
3
4 5
4
13
0
0
2
10
0
2
0
2/3
2/-1 0/1
0/-4
0/0
1
2
3
4 5
4
13
0
0
2
10
0
2
0
2/7
2/3 0/5
0/0
0/4
1
2
3
4 5
4
13
0
0
2
10
0
2
0
2/2
2/-2 0/0
0/-5
0/-1
1
2
3
4 5
4
13
0
0
2
10
0
2
0
4/8
0/0 2/6
2/1
2/5
0 1 -3 4 -4
3 0 -4 1 -1
7 4 0 5 3
2 -1 -5 0 -2
8 5 1 6 0
Proiectarea Algoritmilor 2010
Concluzii Floyd-Warshall & Johnson
Algoritmi ce gsesc drumurile minime ntre
oricare 2 noduri din graf.

Funcioneaz pe grafuri cu arce ce au
costuri negative (dar care nu au cicluri de
cost negativ).

Floyd-Warshall e optim pentru grafuri dese.

Johnson e mai bun pentru grafuri rare.
Proiectarea Algoritmilor 2010
Arbori minimi de acoperire Definiii
Fie G = (V,E) graf neorientat i conex, iar w: E 9 o
funcie de cost (w(u,v) = costul muchiei (u,v)).

Definiie: Un arbore liber al lui G este un graf neorientat
conex i aciclic Arb = (V,E); V _ V, E _ E. Costul
arborelui este: C(Arb) = w(e), e e E.

Definiie: Un arbore liber se numete arbore de
acoperire dac V = V.

Definiie: Un arbore de acoperire (Arb) se numete
arbore minim de acoperire (notm AMA ) dac Arb e
ARB(G) a.. C(Arb) = min{C(Arb) | Arb e ARB(G)}.
Proiectarea Algoritmilor 2010
Exemple
Graf neorientat
conex
Arbore de acoperire:
muchiile punctate nu
fac parte din arbore
Arbore minim de acoperire:
muchiile punctate au fost
eliminate din graf
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Utilizri
Proiectarea reelelor:
Electrice, calculatoare, drumuri.

Clustering.

Algoritmi de aproximare pentru probleme
NP-complete.

Proiectarea Algoritmilor 2010
Exemple de utilizare
MonALISA - Arborele minim de
acoperire al conexiunilor si calitatea
conexiunilor peer-to-peer pentru un
set de relee VRVS (caltech) [1]
Arbore minim de acoperire pentru cca 2850
de orae din USA [2]
Proiectarea Algoritmilor 2010
AMA Definiii (II)
Definiie: Fie A _ E o mulime de muchii ale
unui graf G = (V,E) i (S,V-S) o partiionare a lui
V. Partiionarea respect mulimea A dac e
e A care taie frontiera dintre S i V-S ( (u,v) e
A u,v e S sau u,v e V-S).

Definiie: Fie A _ E o mulime de muchii ale
unui AMA Arb = (V,E) al grafului G = (V,E), iar
e e E o muchie oarecare din G. Muchia e este
sigur n raport cu A dac mulimea A {e}
face parte dintr-un AMA al lui G.

Proiectarea Algoritmilor 2010
AMA Teorem
Teorema 5.23: Fie A o mulime de muchii ale unui AMA al grafului
G = (V,E). Fie (S,V-S) o partiionare care respect A, iar (u,v) e E o
muchie care taie frontiera dintre S i V-S a..
w(u,v) = min{w(x,y) | (x,y) e E i (x e S, y e V-S) sau (x e V-S, y e S)}
Muchia (u,v) este sigur in raport cu A.

Dem (Reducere la absurd):
pp (u,v) nu e muchie sigur.
(I) AMA Arb = (V,E), a.. A E. Pp (u,v) e Arb
n Arb cale u..v (x,y) u..v care taie partiionarea i (x,y) Arb
(x,y) eA, (u,v) e A pt. c partiionarea respect A, iar w(u,v) w(x,y) (I)
Dac n Arb eliminm (x,y) i adugm (u,v) Arb = (V,E), E = E
{(x,y)} + {(u,v)}
C(Arb) C(Arb), Arb AMA C(Arb) = C(Arb) Arb AMA (u,v)
muchie sigur.
x
u
y
v
S
V-S
Proiectarea Algoritmilor 2010
Proprieti (I)
Dem (Reducere la absurd): Pp e e Arb(G).

Eliminnd e din Arb(G) 2 mulimi de
muchii: S
1
, S
2
.

e e E (ciclu) - e e E, w(e) > w(e) a..
un capt din e este n S
1
i celalalt n S
2
.

Arb(G) e + e = arbore de acoperire.

Cost(Arb(G) - w(e) + w(e) < Cost(Arb(G))
=> Arb(G) nu este arbore minim.

G = (V,E), C = (V,E) ciclu n G; e e E
a.. w(e) = max {w(e) | e e E} => e e
Arb(G) unde Arb(G) = AMA n G.

I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Proprieti (II)
Dem (Reducere la absurd): Pp e e
Arb(G).

Arb = Arb(G) e + e (unde e o
muchie similar cu e).

Arb= arbore de acoperire.

Cost(Arb) < Cost(Arb) Arb nu
este arbore minim.

G = (V,E), S = (V,E), V c V; e = (u,v) a.. e e E i (u e
V i v e V) sau (u e V i v e V) cu proprietatea c:
w(u,v) = min{w(u,v)| (ueV i veV) sau (ueV i
veV)} => (u,v) e AMA.
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
AMA
Bazai pe ideea de muchie sigur se identific o muchie
sigur i se adaug n AMA.

2 algoritmi de tip greedy:
Prim: se pornete cu un nod i se extinde pe rnd cu muchiile
cele mai ieftine care au un singur capt n mulimea de muchii
deja format (Proprietatea 2). Algoritmul este asemntor
algoritmului Dijkstra.

Kruskal: iniial toate nodurile formeaz cte o mulime i la
fiecare pas se reunesc 2 mulimi printr-o muchie. Muchiile
sunt considerate n ordinea costurilor i sunt adugate n
arbore doar dac nu creeaz ciclu (Proprietatea 1).
Proiectarea Algoritmilor 2010
Algoritmul lui Prim
Prim(G,w,s)
A = C // AMA
Pentru fiecare (u e V)
d[u] = ; p[u] = null // iniializm distana i printele
d[s] = 0; // nodul de start are distana 0
Q = constrQ(V, d); // ordonat dup costul muchiei
// care unete nodul de AMA deja creat
Ct timp (Q != C) // ct timp mai sunt noduri neadugate
u = ExtrageMin(Q); // extrag nodul aflat cel mai aproape
A = A {(u,p[u])}; // adaug muchia n AMA
Pentru fiecare (v e succs(u))
Dac d[v] > w(u,v) atunci
d[v] = w(u,v); //+ d[u] // actualizm distanele i prinii nodurilor
p[v] = u; // adiacente care nu sunt n AMA nc
ntoarce A - {(s,p(s))} // prima muchie adugat
Implementare n Java la [4] !
Proiectarea Algoritmilor 2010
Exemplu (I)
Pornim din I
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Q: A(3), J(5), L(8),
B(), C(), D(), E(),
F(), G(), H(), K()
A
Proiectarea Algoritmilor 2010
Exemplu (II)
Q: G(2), J(5), H(6),
L(8), B(9), C(), D(),
E(), F(), K() G
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (III)
Q: H(4), J(5), L(8),
B(8), C(), D(), E(),
F(), K() H
Q: G(2), J(5), H(6),
L(8), B(9), C(), D(),
E(), F(), K() G
Proiectarea Algoritmilor 2010
Exemplu (IV)
Q: J(5), L(8), B(8),
C(), D(), E(), F(),
K() J
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (V)
Q: K(2), L(8), B(8),
C(), D(), E(), F()
K
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (VI)
Q: K(2), L(8), B(8),
C(), D(), E(), F()
K
Q: L(7), B(8), C(),
D(), E(), F() L
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (VII)
Q: B(8), C(), D(),
E(), F() B
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (VIII)
Q: C(5), D(), E(),
F() C
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (IX)
Q: E(1), D(8), F()
E
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (X)
Q: F(2), D(8) F
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (XI)
Q: D(8) D
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (XII)
Q:
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Corectitudine (I)
1. Artm c muchiile pe care le adugm aparin Arb:

Dem prin inducie dup muchiile adugate n AMA:

P
1
: avem V = s, E = C. Adaug muchia (u,s), u = nod adiacent
sursei aflat cel mai aproape de aceasta din Propr. 2 (u,s) e
Arb.

P
n
P
n+1
:
S = (V,E) mulimea vrfurilor i muchiilor adugate deja n arbore
nainte de a aduga (u,p[u]).
p[u] e V, u e V; (u,p[u]) are cost minim dintre muchiile care au un
capt n S (conform extrage minim)
din Propr. 2 (u,p[u]) e Arb
Proiectarea Algoritmilor 2010
Corectitudine (II)
2. artm c muchiile ignorate nu fac parte din
Arb:
d[v] scade tot timpul de-a lungul algoritmului pn
cnd v este adugat n AMA. n momentul
adugrii, s-a gsit muchia de cost minim ce
conecteaz nodul v la AMA;
Pp. (u,v) a.. Arb(u) = Arb(v)
(u,v) creeaz un ciclu n Arb(u) (arborii sunt aciclici)
fie ciclul format din u..x..v i (u,v).
w(u,v) = max {w(u,v) | (u,v) e Arb(u)} DE CE?
Nodul u i-a fost adiacent nodului v, dar nu a fost ales la niciunul
din momentele ulterioare de timp, cnd au fost parcurse
muchiile din u..x..v (u,v) are costul maxim din ciclu
din Propr. 1 (u,v) e Arb
Proiectarea Algoritmilor 2010
Algoritmul lui Prim
Prim(G,w,s)
A = C // AMA
Pentru fiecare (u e V)
d[u] = ; p[u] = null // iniializm distana i printele
d[s] = 0; // nodul de start are distana 0
Q = constrQ(V, d); // ordonat dup costul muchiei
// care unete nodul de AMA deja creat
Ct timp (Q != C) // ct timp mai sunt noduri neadugate
u = ExtrageMin(Q); // extrag nodul aflat cel mai aproape
A = A {(u,p[u])}; // adaug muchia n AMA
Pentru fiecare (v e succs(u))
Dac d[v] > w(u,v) atunci
d[v] = w(u,v); //+ d[u] // actualizm distanele i prinii nodurilor
p[v] = u; // adiacente care nu sunt n AMA nc
ntoarce A - {(s,p(s))} // prima muchie adugat
Complexitate?
Proiectarea Algoritmilor 2010
Reminder Dijkstra (II)
Dijkstra(G,s)
Pentru fiecare (u V)
d[u] = ; p[u] = null;
d[s] = 0;
Q = construiete_coada(V) // coad cu prioriti
Ct timp (Q != C)
u = ExtrageMin(Q); // extrage din V elementul cu d[u] minim
// Q = Q - {u} se execut n cadrul lui ExtrageMin
Pentru fiecare (v Q i v din succesorii lui u)
Dac (d[v] > d[u] + w(u,v))
d[v] = d[u] + w(u,v) // actualizez distana
p[v] = u // i printele
Proiectarea Algoritmilor 2010
Complexitate Prim
Depinde de implementare (vezi Dijkstra)
Matrice de adiacen
Heap binar
Heap Fibonacci

Concluzii
O(V
2
)
O(ElogV)
O(VlogV+E)
Grafuri dese
Matrice de adiacen preferat
Grafuri rare
Heap binar sau Fibonacci
Proiectarea Algoritmilor 2010
Algoritmul lui Kruskal
Kruskal(G,w)
A = C; // AMA
Pentru fiecare (v V)
Constr_Arb(v) // creeaz o mulime format din nodul respectiv
// (un arbore cu un singur nod)
Sorteaz_asc(E,w) // se sorteaz muchiile n funcie de
// costul lor
Pentru fiecare ((u,v) E) // muchiile se extrag n ordinea
// costului
Dac Arb(u) != Arb(v) atunci // verificm dac se creeaz ciclu
Arb(u) = Arb(u) Arb(v) // se reunesc mulimile de noduri (arborii)
A = A {(u,v)} // se adaug muchia sigur n AMA
ntoarce A
Implementare n Java la [4] !
Proiectarea Algoritmilor 2010
Exemplu (I)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (II)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (III)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (IV)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (V)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (VI)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (VII)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (VIII)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (IX)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (X)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (XI)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (XII)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (XIII)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (XIV)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Exemplu (XV)
CE -1
EF -2
AG-2
JK-2
AI-3
GH-4
BC-5
IJ-5
AH-6
KL-7
BG-8
CD-8
IL-8
AB-9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Comparaie Prim - Kruskal
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Corectitudine (I)
1. artm c muchiile ignorate nu fac
parte din Arb:
Pp. (u,v) a.. Arb(u) = Arb(v)
(u,v) creeaz un ciclu n Arb(u) (arborii sunt
aciclici)
w(u,v) = max {w(u,v) | (u,v) e Arb(u)} (din
faptul c muchiile sunt sortate cresctor)
din Propr. 1 (u,v) e Arb
Proiectarea Algoritmilor 2010
Corectitudine (II)
2. artm c muchiile pe care le adugm aparin Arb:

Dem prin inducie dup muchiile adugate n AMA:

P
1
: Avem nodurile u i v, cu muchia (u,v) avnd proprietatea
w(u,v) = min {w(u,v) | (u,v) e E} din Propr. 2 (u,v) e Arb.

P
n
P
n+1
:
Arb(u) != Arb(v)
(u,v) muchie cu un capt n Arb(u)
(u,v) are cel mai mic cost din muchiile cu un capt n u (din faptul c
muchiile sunt sortate cresctor)
din Propr. 2 (u,v) e Arb
Proiectarea Algoritmilor 2010
Algoritmul lui Kruskal
Kruskal(G,w)
A = C; // AMA
Pentru fiecare (v V)
Constr_Arb(v) // creeaz o mulime format din nodul respectiv
// (un arbore cu un singur nod)
Sorteaz_asc(E,w) // se sorteaz muchiile n funcie de
// costul lor
Pentru fiecare ((u,v) E) // muchiile se extrag n ordinea
// costului
Dac Arb(u) != Arb(v) atunci // verificm dac se creeaz ciclu
Arb(u) = Arb(u) Arb(v) // se reunesc mulimile de noduri (arborii)
A = A {(u,v)} // se adaug muchia sigur n AMA
ntoarce A
Complexitate?
Proiectarea Algoritmilor 2010
Complexitate Kruskal
Elementele algoritmului:
Sortarea muchiilor: O(ElogE) O(ElogV)
Arb(u) = Arb(v) compararea a 2 mulimi disjuncte
{1,2,3} {4,5,6} mai precis trebuie identificat dac 2
elemente sunt n aceeai mulime
Arb(u) Arb(v) reuniunea a 2 mulimi disjuncte
ntr-una singur

depinde de implementarea mulimilor
disjuncte
Proiectarea Algoritmilor 2010
Variante de implementare mulimi
disjuncte (Var. 1) contraexemplu
Mulimile implementate ca vectori (popular la laborator )
NERECOMANDAT
Reuniune (M1, M2)
Pentru i de la length(M
1
) la
length(M
1
) + length(M
2
)
M
1
[i] = M
2
[i - length(M
1
)]
ntoarce M
1

Complexitate: V
Comparare (M
1
, M
2
)
Pentru fiecare (u M
1
)
Pentru fiecare (v M
2
)
Dac (u = v) ntoarce true
ntoarce false

Complexitate: V
2
numrul de apelri E

Complexitate total: E*V
2
Proiectarea Algoritmilor 2010
Variante de implementare mulimi
disjuncte (Var. 2) Regsire Rapid
Mulimile - vectori
Id - vector de id-uri
coninnd id-ul primului
nod din component



Arb(u) != Arb(v)
Complexitate?
Arb(u) = Arb(u) Arb(v)
Complexitate?
A B C D E F G H I J K L
0 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 0 0 0 0
Complexitate
maxim?
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Regsire rapid (Complexitate)
Compararea O(1) // Cutare n vector i
verificare dac au acelai id
Reuniunea O(V) // trebuie s modifice
toate id-urile nodurilor din una din mulimi

Complexitate maxim
O(V * E) // E = numrul de reuniuni

Inacceptabil pentru grafuri f mari
Proiectarea Algoritmilor 2010
Variante de implementare mulimi
disjuncte (Var. 3) Reuniune Rapid
se folosete tot un
vector auxiliar de id-uri



id[i] reprezint
printele lui i

pentru rdcina
arborelui id[i] = i

A B C D E F G H I J K L
0 1 2 3 4 5 6 7 8 9 10 11
8 1 1 2 2 4 1 6 8 8 9 10
I
L
A
B
C
D
E
F
G
H
J
K
3
5
8
2
7
6
8
2
1
9
8
5
2
4
9
Proiectarea Algoritmilor 2010
Comparare (u, v)
Verific dac 2 noduri au aceeai rdcin;
Implic identificarea rdcinii:

Arb(u) // identificarea rdcinii unei componente
Ct timp (i != id[i]) i = id[i];
ntoarce i

Comparare (u, v)
ntoarce Arb(u) != Arb(v)

Reuniune (u,v) // implic identificarea rdcinii
v = Arb(v)
id[v] = u;
Variante de implementare mulimi disjuncte
reuniune rapid
Complexitate?
Proiectarea Algoritmilor 2010
Reuniune rapid (Complexitate)
Compararea O(V) // n cel mai
ru caz, am o lista i trebuie
s trec din printe n printe.

Reuniunea O(V) // implic
regsirea rdcinii pentru a ti
unde se face modificarea
Proiectarea Algoritmilor 2010
Optimizarea reuniunii rapide (1)
Reuniune rapid balansat

Se menine numrul de noduri din fiecare subarbore.

Se adaug arborele mic la cel mare pentru a face mai
puine cutri nlimea arborelui e mai mic i
numrul de cutri scade de la V la lg V.

Complexitate:
Compararea O(lg V)
Reuniune O(lg V)
Proiectarea Algoritmilor 2010
Optimizarea reuniunii rapide (2)
Reuniune rapid
balansat cu compresia
cii:

Identificarea rdcinii:
Arb(u)
Ct timp (i != id[i])
id[i] = id[id[i]];
i = id[i];
ntoarce i

Menine o nlime redus
a arborilor.
Implementare
n Java i
exemplu la [4]
I
A J
K
L
I
A J
K L
Arborele de noduri
Arborele de id-uri
K: id[K] = id[J] = I
L: id[L] = id[K] = I
Proiectarea Algoritmilor 2010
Complexitate dup optimizri
Orice secven de E operaii de cutare
i reuniune asupra unui graf cu V noduri
consum O(V + E*(V,E)).

de cte ori trebuie aplicat lg pentru a
ajunge la 1.
n practic este 5.

n practic O(E)
Proiectarea Algoritmilor 2010
Complexitate Kruskal
Max (complexitate sortare, complexitate
operaii mulimi) = max(O(ElogV), O(E)) =
O(ElogV)

Complexitatea algoritmului Kruskal
este dat de complexitatea sortrii
costurilor muchiilor.
Proiectarea Algoritmilor 2010
Aplicaie practic
K-clustering
mprirea unui set de obiecte n grupuri astfel nct
obiectele din cadrul unui grup s fie apropiate
considernd o distan dat.

Utilizat n clasificare, cutare (web search de
exemplu).

Dndu-se un ntreg K s se mpart grupul de
obiecte n K grupuri astfel nct spaiul dintre
grupuri s fie maximizat.
Proiectarea Algoritmilor 2010
Exemplu
Proiectarea Algoritmilor 2010
Algoritm
Se formeaz V clustere (un cluster per
obiect).

Gsete cele mai apropiate 2 obiecte din
clustere diferite i unete cele 2 clustere.

Se oprete cnd au mai rmas k clustere.

chiar algoritmul Kruskal
NTREBRI?

Proiectarea Algoritmilor 2010 79
Proiectarea Algoritmilor 2010
Bibliografie curs 10
[1] C. Giumale Introducere in Analiza
Algoritmilor - cap. 5.6

[2] Cormen Introducere in algoritmi -
cap. 27

[3] Wikipedia -
http://en.wikipedia.org/wiki/Ford-
Fulkerson_algorithm