Sari la conținut

Ghid de informatică pentru admitere

Complexitatea algoritmilor pentru admitere

Pornește de la operația pe care o numeri și de la dimensiunea datelor. Două bucle nu înseamnă automat un algoritm pătratic: contează dacă sunt consecutive sau imbricate și cum se schimbă indicii.

Lecție scrisă de Admitero · Actualizat la

Roadmap de admitere

Alege materia

Roadmap în Plus

Număr exact, O și Θ

Dacă o instrucțiune se execută 3n+73n+7 ori, acesta este numărul exact în modelul ales. Ordinul de creștere este liniar: Θ(n)\Theta(n). Notația O(n)O(n) exprimă o limită superioară asimptotică; Θ(n)\Theta(n) descrie o limită strânsă, de sus și de jos.

Un algoritm liniar este și O(n2)O(n^2), însă răspunsul cel mai informativ este limita strânsă. Citește dacă problema cere numărul exact de execuții sau complexitatea.

La admitere se folosește frecvent modelul în care o operație aritmetică pe un întreg de dimensiune fixă costă o unitate. Exemplificările de aici presupun că valorile încap în tipurile folosite.

Bucle consecutive și bucle imbricate

Două parcurgeri consecutive cu nn pași fiecare au n+n=2nn+n=2n pași, deci ordin liniar. Dacă pentru fiecare dintre cei nn pași exteriori rulează alți nn pași interiori, obții n⋅n=n2n\cdot n=n^2.

O limită interioară variabilă cere o sumă. Pentru i=1,2,…,ni=1,2,\ldots,n, dacă bucla interioară rulează de ii ori, numărul total este:

1+2+⋯+n=n(n+1)2.1+2+\cdots+n=\frac{n(n+1)}{2}.

Ordinul rămâne Θ(n2)\Theta(n^2), deși numărul exact nu este n2n^2. Pentru o sumă de costuri, termenul cu creșterea dominantă stabilește ordinul: n2+100n+20n^2+100n+20 este Θ(n2)\Theta(n^2).

Când apare logaritmul

Urmărește o buclă care împarte repetat o valoare pozitivă la 2:

for (int k = n; k > 0; k /= 2) {
  ++pasi;
}

Pentru n = 13, valorile sunt 13, 6, 3 și 1: patru pași. Împărțirea între întregi trunchiază rezultatul. Pentru n >= 1, numărul de pași este partea întreagă a lui log₂(n), plus 1. Ordinul este logaritmic. Pentru n = 0, bucla nu rulează.

Dacă rulezi această buclă pentru fiecare dintre cele n elemente ale unui vector, cu același n inițial de fiecare dată, costul total este de ordinul n log n.

Timpul și memoria sunt întrebări diferite

O buclă cu un contor poate face n2n^2 operații și folosi doar O(1)O(1) memorie auxiliară. Un vector suplimentar cu nn elemente ocupă O(n)O(n) memorie auxiliară, chiar dacă îl completezi într-o singură parcurgere.

La funcțiile recursive, include stiva apelurilor. Un lanț de nn apeluri cu un număr constant de variabile locale ocupă O(n)O(n) memorie auxiliară. Vezi urmărirea apelurilor recursive.

Dacă algoritmul poate termina anticipat, precizează cazul analizat. Căutarea liniară într-un vector poate găsi elementul la prima poziție, dar în cazul cel mai defavorabil verifică toate cele nn poziții.

Greșeli de evitat

  • Înmulțești costurile unor bucle consecutive, deși ele se adună.

  • Numeri fiecare buclă interioară ca având n pași, deși limita depinde de i.

  • Confunzi numărul de pași cu valoarea finală a unui acumulator.

  • Ignori memoria stivei sau confunzi memoria auxiliară cu memoria datelor de intrare.

Exemplu rezolvat

Problemă

Pentru un întreg n >= 1, suficient de mic încât calculele să încapă în tipurile folosite, de câte ori se execută ++s? Care sunt costurile în timp și memorie auxiliară?

long long s = 0;
for (int i = 1; i <= n; ++i) {
  for (int j = 1; j <= i; ++j) {
    ++s;
  }
}
for (int k = n; k > 0; k /= 2) {
  ++s;
}

Rezolvare

Prima parte execută incrementarea de 1+2+⋯+n=n(n+1)/21+2+\cdots+n=n(n+1)/2 ori. A doua parte adaugă ⌊log⁡2n⌋+1\lfloor\log_2 n\rfloor+1 incrementări. Buclele sunt consecutive, deci aduni:

s=n(n+1)2+⌊log⁡2n⌋+1.s=\frac{n(n+1)}{2}+\lfloor\log_2 n\rfloor+1.

Pentru n=8n=8, prima parte dă 36, iar a doua are valorile k=8,4,2,1k=8,4,2,1, deci 4 pași. Rezultatul este 40.

Timpul este Θ(n2)\Theta(n^2), iar memoria auxiliară este O(1)O(1): numărul de variabile nu crește cu nn.

Treci la exersat

Exersează complexitatea algoritmilor.

Pentru grile din această lecție, selectează informatică și subcapitolul complexitatea algoritmilor.

Rezolvă grile de informatică

Continuă cu grile de informatică și lecții pentru admitere sau vezi grilele Poli și ghidurile facultăților.