Sortare - continuare
O problemă – mai multe variante de rezolvare Factori care determină alegerea
Care algoritm e mai bun? Cum alegem? Timp de execuție
2∙(10 7)2
SC =20000 sec .=5 h :33 m:20 s
1010
50∙ 107 ∙ log (107 )
PC =1162.7 sec .=0 h :19 m:22.67 s
107
Obs.: pentru masive de dimensiuni mici, sortarea prin inserare e mai rapidă decît cea prin interclasare →
se pot combina
Pentru compararea algoritmilor - indicatori de complexitate, calculați la nivel teoretic, independent de
echipament
Timpul de execuție este măsurat prin timpii operațiilor primitive și este funcție de dimensiunea datelor
Timpul de execuție depinde și de valori concrete ale datelor: cel mai bun (favorabil) caz / caz mediu
(uzual) / cel mai rău (nefavorabil) caz
Analiza pentru dimensiuni mari ale datelor de intrare
Calculul timpul de execuție exact nu e eficient sau necesar
Termenul de rang maxim domină ceilalți termeni→ este factorul relevant, este singurul luat în calcul și se
numește ordin de creștere
Ordin de creștere (complexitate) mai mic în cel mai defavorabil caz → algoritm mai bun
Dacă ordinul de creștere este factor relevant → analiza este referită prin studiul eficienței asimptotice
Eficiență asimptotică mai bună → algoritm mai bun (eventual cu excepția cazurilor extreme)
Ordin de creștere
Θ ( g ( n ) )= {f ( n ) ∨∃c 1 , c 2 , n0 a .î . 0 ≤ c1 ∙ g ( n ) ≤ f ( n ) ≤ c 2 ∙ g ( n ) , ∀ n ≥ n0 }
c 1 ∙ n2 ≤ 3 n2−2 n ≤c 2 ∙n 2 , ∀ n ≥n 0 ¿ n2
2 2
c 1 ≤ 3− ≤ c 2 → 3− ∈¿ → c 1=1, c 2=3 , n0 =1
n n
Exemplu
h ( n ) =2 n3 h ( n ) ∈Θ ( n2 ) ? c 1 ∙ n2 ≤ 2n3 ≤ c 2 ∙ n2 , ∀ n ≥ n0
c22*g(n)
• Coeficientul termenului de rang maxim
f(n)
c11*g(n)
n00 n
• Afectează doar c 1 și c 2 cu un factor constant → se poate ignora
• Restul formulei
• compensată prin ajustarea c 1 și c 2 → se
poate ignora
0
• Θ ( 1 ) sau Θ ( n ) → timp de execuție constant
• Notația asimptotică O ( … ) limită superioară
• O ( g ( n ) )= {f ( n ) ∨∃c ,n 0 a. î . f ( n ) ≤ c ∙ g ( n ) , ∀ n ≥ n0 }
• g- limită asimtotică superioară pentru f
• Timp de execuție pentru cel mai nefavorabil caz c*g(n)
• Θ ( g ( n ) ) ⊆O ( g ( n ) )
• f ( n )=n f ( n ) ∈ O ( n ) f ( n ) ∈ O ( n2 ) f ( n ) ∈ O ( n3 ) f(n)
…
• Notația asimptotică Ω ( … ) limită inferioară
• Ω ( g ( n ) ) ={f ( n )∨∃c , n0 a . î . 0 ≤ c ∙ g ( n ) ≤ f ( n ) , ∀ n ≥ n0 }
• g- limită asimtotică inferioară pentru f
• Timp de execuție pentru cel mai favorabil caz
n00 n
Sortare rapidă
Q(x, p,u)
dacă p<u
k=poziționare(x, p, u)
Q(x, p, k-1)
Q(x, k+1, u)
*poziționare(x, p, u)
indi=0; indjj=-1; i=p; j=u;
while i<j
if x[i]>x[j]
x[i] <-> x[j]
if indi==0
indi=1; indj=0;
else
indi=0; indj=-1;
i=i+indi;j=j+indj;
return i (k=i)
Analiza complexității
Cel mai defavorabil caz - poziționarea produce de fiecare dată o secvență cu u-p elemente și secvența vidă
Fie n=u− p+1.
Costul poziționării - Θ ( n )
Costul sortarii secvenței vide - Θ ( 1 )
T R ( n ) =T R ( n−1 ) +Θ ( n ) →T R ( n )=O ( n2 )
Cel mai bun caz - fiecare partiție determină împărțirea secvenței inițiale în două subsecvențe balansate.
Rezultă
n
()
T B ( n )=2 ∙ T B
2
+Θ ( n ) →T B ( n ) =O ( n ∙ log ( n ) )
Poziționare_rand( a, p, u) Qsort_rand( a, p, u)
nou = random(p,u) if p<u
a[p] ↔ a[nou]; poz = Poziționare_rand(a,p,u)
poz = poziționare (a, p, u) Qsort_rand(a, p, poz-1)
Qsort_rand(a, poz+1,u)