Sunteți pe pagina 1din 10

Algoritmi Divide et Impera

22 octombrie 2004
1 Introducere
O modalitate de a rezolva problemele este prin divizarea lor n subprobleme de dimensiune mai mic a,
n speranta c a, prin divizare repetat a si combinarea subsolutiilor, complexitatea rezultat a va mai
bun a dect cea initial a.
n general, o solutie de tip divide et impera
mparte problema n subprobleme de dimensiune mai mic a dect dimensiunea de pornire
rezolv a (prin apel recursiv al algoritmului) subproblemele
combin a subsolutiile
Astfel, timpul de executie al algoritmului se scrie:
T(n) =
_
(1), n n
0
aT(
n
b
) +D(n) +c, alt f el
adic a algoritmul se rezolv a n timp constant pentru o dimensiune a problemei mai mic a dect o
valoare n
0
(uzual, n
0
este egal cu 0, 1 sau 2), si se scrie recurent pentru dimensiuni mai mari ale
problemei. Solutia T(n) se g ase ste e dezvoltnd recurenta pn a cnd subproblemele T(
n
b
) devin
probleme de dimensiune mai mic a sau egal a cu n
0
, e aplicnd teorema master.
n continuare se studiaz a diferite probleme cu solutii divide et impera.
2
2 Sort ari si c aut ari pe vectori
2.1 Sortarea prin combinare (MergeSort)
Fie un vector A de n elemente. O solutie de sortare a acestora este mp artirea vectorului n jum at ati,
sortarea acestora si combinarea celor doi subvectori sortati:
MergeSort (A, index_low, index_high)
if index_low < index_high
index_mid = (index_high+index_low)/2
MergeSort (A, index_low, index_mid)
MergeSort (A, index_mid+1, index_high)
Merge (A, index_low, index_mid, index_high)
Procedura Merge combin a (printr-o metod a sau alta) doi vectori sortati ntr-un singur vector sortat, n
timp liniar. Timpul de executie al solutiei se calculeaz a cu egalitatea:
T(n) =
_
(1), n = 1
2T(
n
2
) +O(n), alt f el
Rezolv am T(n) prin reducerea recurentei (ca mai jos) sau cu teorema master:
T(n) = 2T(
n
2
) +an = 2
k
T
_
n
2
k
_
+kan, k, 1 k log(n)
Rezult a T(n) = n T(1) +an log(n) = O(n log(n)).
2.2 Sortarea rapid a (QuickSort)
QuickSort este un algoritm de sortare asem an ator cu MergeSort. QuickSort difer a de MergeSort prin
modul de divizare a vectorului initial n doi vectori mai mici: divizarea se face mp artind elemen-
tele vectorului initial n functie de relatia ec arui element cu un element pivot (ales tot din vector).
Elementele mai mici dect pivotul sunt plasate n prima jum atate, iar celelalte n a doua jum atate.
Algoritmul prezentat n continuare alege ca pivot primul element din vector:
QuickSort (A, index_low, index_high)
if index_low < index_high
index_mid = Partition (A, index_low, index_mid)
QuickSort (A, index_low, index_mid)
QuickSort (A, index_mid+1, index_high)
Partition (A, index_low, index_mid)
pivot = A[index_low]
3
i = index_low - 1, j = index_high + 1
while true
j-- until A[j]pivot
i++ until A[i]pivot
if i<j
interschimba A[i] cu A[j]
else return j
Timpul de executie a algoritmului depinde de gradul de echilibrare al partition arii. Dac a elementul
pivot se alege n a sa fel nct partitionarea s a se fac a n p arti egale (cazul cel mai favorabil), complexi-
tatea QuickSort este identic a cu complexitatea MergeSort (O(n log(n)). n cazul cel mai defavorabil,
n care partitionarea se face n vectori de 1, respectiv n1 elemente, timpul de executie este O(n
2
).
n cazul mediu, se poate demonstra c a timpul mediu de executie al sort arii rapide este O(n log(n)).
2.3 C autarea binar a (BinarySearch)
Fie un vector A de n elemente sortate. C autarea binar a returneaz a (dac a exist a) pozitia elementului de
valoare egal a cu o cheie n A, observnd c a putem simplica parcurgerea vectorului, pentru c a acesta
este sortat:
BinarySearch (A, index_low, index_high, cheie)
if index_low < index_high
index_mid = (index_high+index_low)/2
if cheie = A[index_mid]
return index_mid
else if cheie < A[index_mid]
BinarySearch (A, index_low, index_mid)
else
BinarySearch (A, index_mid, index_high)
else return (A[index_low] == cheie)? index_low: false
Timpul de executie al algoritmului se calculeaz a prin egalitatea:
T(n) =
_
(1), n = 1
T(
n
2
) +O(1), alt f el
Recurenta se poate rezolva ca mai jos (sau aplicnd teorema master):
T(n) = T
_
n
2
_
+c = T
_
n
2
k
_
+kc, k, 1 k log(n)
Pentru k = log(n) rezult a T(n) = T(1) +c log(n) = O(log(n)).
4
3 nmultiri de numere si matrici
3.1 nmultirea numerelor (metoda Karatsuba)
Fie dou a numere x si y formate din cte n cifre (n orice baz a de num arare; exemplicarea urm atoare
folose ste numere n baza 10, dar metoda este valabil a pentru orice alta baz a). Cele dou a numere au
forma:
x = x
n1
x
n2
...x
1
x
0
y = y
n1
y
n2
...y
1
y
0
Produsul lor are 2 n cifre si se scrie:
z = z
2n1
z
2n2
...z
1
z
0
Considernd baza de scriere zecimal a, valorile x, y si z se scriu ca x =
n1
i=0
x
i
10
i
, y =
n1
i=0
y
i
10
i
si
z =
2n1

i=0
z
i
10
i
=
_
n1

i=0
x
i
10
i
_

_
n1

i=0
y
i
10
i
_
Astfel, determinarea cifrelor produsului z se reduce la rezolvarea unui produs de sume sau, prin
metoda de nmultire clasic a, la adunarea a n produse partiale. Complexitatea procedurii standard de
nmultire este O(n
2
).
ncerc am o solutie prin divizarea problemei. Fie numerele a, b, c si d rezultate din numerele initiale
x si y prin njum at atire, astfel:
a = x
n1
x
n2
...x
n
2
, b = x
n
2
1
...x
1
x
0
c = y
n1
y
n2
...y
n
2
, d = y
n
2
1
...y
1
y
0
Acum, numerele x, y si z se pot scrie ca x = a 10
n
2
+b, y = c 10
n
2
+d si
z = x y = ac 10
n
+(ad +bc) 10
n
2
+bd
Din ultima form a de scriere a z, se observ a c a am redus produsul a dou a numere de n cifre la 4
produse (ac, ad, bc si bd) a cte dou a numere de
n
2
cifre, plus dou a nmultiri cu puteri ale lui 10 (care
se rezolv a u sor n O(n)) si o adunare (tot O(n)). Atunci timpul de executie a noului algoritm este
T(n) =
_
(1), n 1
4T
_
n
2
_
+O(n), alt f el
Rezolv am recurenta scriind
T(n) = 4T
_
n
2
_
+an = 16T
_
n
4
_
+2an = 2
2k
T
_
n
2
k
_
+kan, k, 1 k log(n)
5
Pentru k = log(n) (sau direct, din teorema master), avem T(n) = n
2
T(1) +an log(n) = O(n
2
).
Rezultatul este dezam agitor deocamdat a, pentru ca nu am reu sit reducerea complexit atii solutiei.
Totu si, pentru determinarea produsului z avem nevoie numai de 3 produse de numere de dimensiune
n
2
, dup a cum vom vedea n continuare. Alegem produsele:
U = ac, V = bd, W = (a+b)(c +d)
cu ajutorul c arora putem scrie si
ad +bc =W U V
Atunci, se poate scrie produsul z ca ind
z =U 10
n
+(W U V) 10
n
2
+V
Astfel, am redus determinarea lui z la determinarea a 3 produse de numere de
n
2
cifre. Putem scrie
algoritmul de nmultire astfel:
Karatsuba(x,y,n)
if n>1
se scriu numerele a,b,c si d
U = Karatsuba (a, c,
n
2
)
V = Karatsuba (b, d,
n
2
)
W = Karatsuba (a+b, c+d,
n
2
)
return U10
n
+(W-U-V)10
n
2
+V
Timpul de executie al noului algoritm este
T(n) = 3T
_
n
2
_
+an = 9T
_
n
4
_
+(1+
3
2
)an = 3
k
T
_
n
2
k
_
+
_
k1

i=0
_
3
2
_
i
_
an, k, 1 k log
2
(n)
Rezult a din egalitatea de mai sus (sau direct din teorema master) c a
T(n) = 3
k
T
_
n
2
k
_
+2
_
_
3
2
_
k
1
_
an = 3
log
2
n
O(1) +
_
3
log
2
n
n
1
_
O(n) = O
_
n
log
2
3
_
Deci T(n) = O
_
n
log
2
3
_
= O
_
n
1,58
_
, o mbun at atire substantial a a valorii initiale O(n
2
).
3.2 nmultirea matricilor (metoda Strassen)
Pentru nmultirea matricilor p atratice (care se rezolv a dup a metoda standard n timp O(n
3
)) exist a o
metod a de rezolvare prin divizare similar a metodei de nmultire a numerelor (n dou a dimensiuni).
Fie matricile p atratice de dimensiune n A si B. Calcul am produsul C =A B prin divizarea matricilor
A si B n matrice p atratice de dimensiune
n
2
, astfel:
_
C
11
C
12
C
21
C
22
_
=
_
A
11
A
12
A
21
A
22
_

_
B
11
B
12
B
21
B
22
_
Rezult a c a submatricile rezultat din C se pot calcula cu relatiile
6
C
11
= A
11
B
1
+A
12
B
21
C
12
= A
11
B
12
+A
12
B
22
C
21
= A
21
B
11
+A
22
B
21
C
22
= A
21
B
12
+A
22
B
22
ceea ce duce la observatia c a este nevoie de 8 nmultiri de matrice p atratice de dimensiune
n
2
pentru
calculul produsului C n timp O(n
3
).
Pentru a mic sora complexitatea solutiei, se calculeaz a submatricile:
P
1
= (A
11
+A
12
) (B
11
+B
22
)
P
2
= (A
21
+A
22
) B
11
P
3
= A
11
(B
12
B
22
)
P
4
= A
22
(B
21
B
11
)
P
5
= (A
11
+A
12
) B
22
P
6
= (A
21
A
11
) (B
11
+B
12
)
P
7
= (A
12
A
22
) (B
21
+B
22
)
cu ajutorul c arora se poate exprima matricea rezultat C astfel:
C
11
= P
1
+P
4
P
5
+P
7
C
12
= P
3
+P
5
C
21
= P
2
+P
4
C
22
= P
1
+P
3
P
2
+P
6
Astfel, solutia este calculat a prin intermediul calculului a 7 produse de matrici de dimensiune
n
2
,
ceea ce face ca timpul de executie s a e
T(n) =
_
(1), n = 1
7T
_
n
2
_
+O(n), alt f el
de unde complexitatea solutiei rezult a T(n) = O(n
log7
) = O(n
2,807
).
7
4 Selectii
Problema selectiei este problema g asirii pozitiei ntr-un vector A de dimensiune n a elementului care
este al i-lea element n ordine cresc atoare dintre toate elementele vectorului. G asirea minimului este
problema selectiei pentru i = 1, iar g asirea maximului este problema selectiei pentru i = n; aceste
dou a probleme particulare se rezolv a n O(n).
Mediana unui vector este acel element al vectorului care se a a pe pozitia
n
2
n ordinea cresc atoare
a elementelor (exist a dou a mediane dac a vectorul are un num ar par de elemente).
Selectia general a se poate rezolva f acnd o sortare initial a a vectorului A si indexnd elementul i n
O(n log(n)). Exist a si solutii mai performante asimptotic, prezentate n continuare.
4.1 Selectia n timp liniar n cazul mediu
Solutia de selectie n timp liniar n cazul mediu lucreaz a pe principiul QuickSort cu alegere aleatoare
a pivotului, partitionnd vectorul de intrare si c autnd recursiv numai n una din partitiile rezultate (ca
si BinarySearch):
RandomSelect (A, index_low, index_high, i)
if index_low = index_high
return A[index_low]
index_mid = RandomPartition (A, index_low, index_high)
k = index_mid - index_low + 1
if ik
return RandomSelect (A, index_low, index_mid, i)
else
return RandomSelect (A, index_mid+1, index_high, i-k)
De si n cazul cel mai nefavorabil timpul de executie este T(n) = O(n
2
), n cazul mediu se poate
demonstra c a selectia poate f acut a n timp liniar.
4.2 Selectia n timp liniar n cazul defavorabil
O mbun at atire a algoritmului precedent este acea solutie care lucreaz a similar cu cea de mai sus,
doar c a se asigur a c a partitionarea vectorului este oarecum echilibrat a, alegnd pivotul de partitionare
aproape de mediana vectorului:
Select (A, index_low, index_high, i)
if index_low = index_high
return A[index_low]
- se impart cele n elemente ale A in grupe de cate (maxim) 5
- se determina mediana fiecarei grupe prin sortare
- se apeleaza recursiv Select pentru determinarea medianei medianelor x
8
- se partitioneaza A in jurul pivotului x
k = noua pozitie a x
if ik
return Select (A, index_low, k, i)
else
return Select (A, k+1, index_high, i-k)
Pentru determinarea complexit atii exacte n cazul cel mai defavorabil a algoritmului, trebuie studiat a
partitionarea defavorabil a, n care num arul maxim de elemente se mpart dezechilibrat ntre partitii.
Astfel, cel putin jum atate din medianele grupelor (
n
10
mediane) sunt mai mari dect mediana media-
nelor x. Atunci, cel putin
n
10
grupe au cte 3 elemente mai mari dect x, cu exceptia ultimului grup (cu
mai putin de 5 elemente) si a grupului propriu elementului x.
Atunci num arul minim al elementelor mai mari dect x este 3
_
n
10
2
_
=
3n
10
6, iar partitia cea mai
mare rezultat a are maxim
7n
10
+6 elemente, de unde complexitatea n cazul defavorabil se scrie:
T(n) =
_
(1), n 80
T
__
n
5
__
+T(
7n
10
+6) +O(n), alt f el
Faptul c a T(n) se execut a n timp liniar poate demonstrat ar atnd c a egalitatea de mai sus r amne
adev arat a pentru T(n) = c n, unde constanta c este ndeajuns de mare.
9
Cuprins
1 Introducere 2
2 Sort ari si c aut ari pe vectori 3
2.1 Sortarea prin combinare (MergeSort) . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Sortarea rapid a (QuickSort) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 C autarea binar a (BinarySearch) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 nmultiri de numere si matrici 5
3.1 nmultirea numerelor (metoda Karatsuba) . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 nmultirea matricilor (metoda Strassen) . . . . . . . . . . . . . . . . . . . . . . . . 6
4 Selectii 8
4.1 Selectia n timp liniar n cazul mediu . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.2 Selectia n timp liniar n cazul defavorabil . . . . . . . . . . . . . . . . . . . . . . . 8
10

S-ar putea să vă placă și