Documente Academic
Documente Profesional
Documente Cultură
ro
Schema general
function DivImp(p,u)
if up<
r Rezolva(p,u)
else m Interm(p,u);
r1 DivImp(p,m);
r2 DivImp(m+1,u);
r Combina(r1,r2)
return r
end;
Exemple:
function DivImp(p,u)
if up<2
r Cmmdc2(a[p],a[u])
else m (p+u)/2;
r1 DivImp(p,m);
r2 DivImp(m+1,u);
r Cmmdc2(r1,r2)
return r
end;
unde funcia Cmmdc2(a,b) calculeaz cel mai mare divizor comun a dou numere a i b
Parcurgerile n preordine, inordine i postordine ale unui arbore binar;
Sortarea folosind arbori de sortare.
Mai pe scurt, putem spune:
Metoda Divide et Impera const n:
- construirea dinamic a unui arbore (prin mprirea n subprobleme) urmat de
- parcurgerea n postordine a arborelui (prin asamblarea rezultatelor pariale).
pentru 2 elemente, adic pentru u=p+1: se alege i=p. Dac x<ai, atunci up-1. Se observ
c se iese din ciclul while i ai-1<x<ai=ap;
pentru un element, adic p=u: se alege i=p=u. Dac x<ai atunci up-1, iar dac x>ai
atunci pu+1; n ambele cazuri se prsete ciclul while i tiprete un rezultat corect.
2T(n/2)+an, pentru n>1, unde a este o constant: problema de dimensiune n s-a descompus
n dou subprobleme de dimensiune n/2, iar combinarea rezultatelor s-a fcut n timp liniar
(prin interclasare).
Presupunem c n=2k. Atunci:
T(n) = T(2k) = 2 T(2k-1) + a 2k =
= 2[2T(2k-2) + a 2k-1] + a 2k = 22T(2k-2) + 2 a 2k =
= 22[T(2k-3) + a 2k-2] + 2 a 2k = 23T(2k-3) + 3 a 2k =
. . .
= 2iT(2k-i) + i a 2k =
. . .
= 2kT(1) + k a 2k = nt0 + a. n .log2n.
Numrul de inversiuni
Problem (aplicaie). Se consider un vector cu n elemente. S de determine numrul de
inversiuni din acest vector (numrul de perechi (i, j) cu proprietatea c i < j i ai > aj)
Aplicaii:
Msur a diferenei ntre dou liste ordonate
Gradul de ordonare al unui vector
Probleme de analiz a clasificrilor (ranking)
Asemnarea ntre preferinele a doi utilizatori sugestii de utilizatori cu preferine
similare
Asemnri dintre rezultatele ntoarse de motoare diferite de cutare pentru aceeai
cerere
collaborative filtering
Soluie. Un algoritm cu complexitatea O(n2) este evident. Putem ns rezolva problema printr-un
algoritm cu complexitatea O(n lg n), numrnd inversiunile n timpul sortrii prin interclasare.
Mai exact:
numrul de inversiuni dintr-un vector = numrul de inversiuni din subvectorul stng (prima
jumtate) + numrul de inversiuni din subvectorul drept + numrul de inversiuni (i, j) cu i m
indice n subvectorul stng i j > m indice n subvectorul drept (am notat cu m indicele
elementului din mijlocul vectorului).
Pentru a numra inversiunile (i, j) cu i m i j > m observm c la interclasare au loc
urmtoarele:
1. cnd un element de pe poziia j cu j > m este adugat n vectorul rezultat, el este mai mic
(doar) dect toate elementele din subvectorul stng neadugate nc n vectorul rezultat;
astfel, a[j] determin m i + 1 inversiuni cu elemente din subvectorul stng
2. cnd un element de pe poziia i cu i m este adugat n vectorul rezultat, el este mai
mare (doar) dect toate elementele din subvectorul drept adugate deja la vectorul rezultat
Avem astfel dou modaliti de a numra inversiunile la interclasare.
Implementarea acestei aplicaii se gsete n fiierul Inversiuni_1.java (varianta 1) i
Inversiuni_2.java (varianta 2)
Exemplu - vezi slideuri curs DI
5
Fie (ap,...,au) secvena curent care trebuie sortat. Vom poziiona pe ap n secvena
(ap,...,au), adic printr-o permutare a elementelor secvenei:
x=ap va trece pe o poziie k;
toate elementele aflate la stnga poziiei k vor fi mai mici dect x;
toate elementele aflate la dreapta poziiei k vor fi mai mari dect x.
n acest mod ap va aprea pe poziia sa final, rmnnd apoi s ordonm cresctor
elementele aflate la stnga sa, precum i pe cele aflate la dreapta sa.
Fie poz funcia cu parametrii p,u care ntoarce indicele k pe care va fi poziionat ap n
cadrul secvenei (ap,...,au).
Atunci sortarea se realizeaz prin apelul QuickSort(1,n), unde procedura QuickSort
are forma:
procedure QuickSort(p,u)
if p = u
else m poz(p,u); QuickSort(p,m-1); QuickSort(m+1,n)
end
(*)
ii+di; jj+dj
return i
end
unde prin am notat interschimbarea valorilor.
6
Trecem la calculul timpului mediu de executare al algoritmului Quicksort. Vom numra
cte comparri se efectueaz (componentele vectorului nu sunt neaprat numere, ci elemente
dintr-o mulime ordonat oarecare). Timpul mediu este dat de formulele:
1
T(n) n 1
n
T(1) T 0 0
k 1
deoarece:
n cazul cel mai defavorabil a1 se compar cu celelalte n-1 elemente;
a1 poate fi poziionat pe oricare dintre poziiile k=1,2,...,n; considerm aceste cazuri
echiprobabile;
T(k-1) este timpul (numrul de comparri) necesar ordonrii elementelor aflate la stnga
poziiei k, iar T(n-k) este timpul necesar ordonrii elementelor aflate la dreapta poziiei k.
nT(n) = n(n-1)+2[T(0)+T(1)+...+T(n-1)]
(n-1)T(n-1) = (n-1)(n-2)+2[T(0)+...+T(n-2)]
mprim cu n(n+1):
T(n) T(n 1) 2(n 1)
n 1
n
n(n 1)
T(n) T(n 1) 2
1
2
n 1
n
n
1
n
T(n 1) T(n 2) 2
1
n
n 1
n n 1
...........................
T(2) T(1) 2 1
2
3
2
3 2
1
n
3
n
1
T(n)
2
n 1
n+1
T(n)
2
n 1
1
dx 2lnx|2n 1 2.ln(n+1)
x
(am folosit o inegalitate bazat pe sumele Riemann inferioare pentru funcia f(x)=1/ x).
Deci T(n)=O(n.log n).
Variant (cu rezultate bune n practic): Sortarea prin interclasare cu pivot aleator
procedure QuickSortR(p,u)
if p = u
else k pozRand(p,u); QuickSortR(p,k-1); QuickSortR(k+1,n)
end
7
function pozRand(p,u)
r random(p,u);
end
a[r] a[p];
return poz(p,u)
Statistici de ordine
Problem (aplicaie). Dat un vector a de n numere i un indice k, 1 k n, s se determine
al k-lea cel mai mic element din vector.
Soluie. Cadru general: Statistici de ordine
A i-a statistic de ordine a unei mulimi de n elemente este al i-lea cel mai mic element.
Minimul = prima statistic de ordine
Maximul = a n-a statistic de ordine
Mediana = punctul de la jumtatea drumului unei mulimi = o valoare v cu proprietatea
c numrul de elemente din mulime mai mici dect v este egal cu numrul de elemente
din mulime mai mari dect v. Dac n este impar, atunci mediana este a n/2 -a statistic
de ordine, altfel, prin convenie mediana este media aritmetic dintre a n/2 -a statistic
i a ( n/2 +1)-a statistic de ordine
Un algoritm optim de determinare a minimului sau maximului necesit n 1 comparaii, iar un
algoritm de determinare simultan a minimului i maximului, 3 n/2 -2 comparaii (v. seminar).
Pentru a rezolva problema determinrii celui de al k-ale minim (celei de a k-a statistic de ordine)
folosim idea de partiionare de la QuickSort
function kmin(p,u)
m pozRand(p,u);
if (m = k)
return am
if(m < k) return kmin(m+1,u)
else
return kmin(p,m-1)
end