logo

Tutorial de notație Big O – Un ghid pentru analiza Big O

Notație O mare este un instrument puternic folosit în informatică pentru a descrie complexitatea timpului sau complexitatea spațială a algoritmilor. Acesta oferă o modalitate standardizată de a compara eficiența diferiților algoritmi în ceea ce privește performanța lor în cel mai rău caz. Înţelegere Notație O mare este esențială pentru analiza și proiectarea algoritmilor eficienți.

În acest tutorial, vom acoperi elementele de bază ale Notație O mare , semnificația sa și modul de analiză a complexității algoritmilor folosind Big O .



Cuprins

100 km/h în mph

Ce este notația Big-O?

Big-O , denumit în mod obișnuit ca Ordinul de , este o modalitate de a exprima limită superioară a complexității timpului unui algoritm, deoarece analizează cel mai rău caz situația algoritmului. Oferă un Limita superioară asupra timpului luat de un algoritm în ceea ce privește dimensiunea intrării. Este notat ca O(f(n)) , Unde f(n) este o funcție care reprezintă numărul de operații (pași) pe care le efectuează un algoritm pentru a rezolva o problemă de dimensiune n .



Notație Big-O este folosit pentru a descrie performanța sau complexitatea unui algoritm. Mai exact, descrie în cel mai rău caz în ceea ce privește timp sau complexitatea spatiului.

Punct important:

  • Notație O mare descrie doar comportamentul asimptotic al unei funcții, nu valoarea ei exactă.
  • The Notație O mare poate fi folosit pentru a compara eficiența diferiților algoritmi sau structuri de date.

Definiția notației Big-O:

Date două funcții f(n) și g(n) , noi spunem asta f(n) este O(g(n)) dacă există constante c> 0 și n 0 >= 0 astfel încât f(n) <= c*g(n) pentru toți n>= n 0 .



În termeni mai simpli, f(n) este O(g(n)) dacă f(n) crește nu mai repede decât c*g(n) pentru toate n>= n0unde c și n0sunt constante.

De ce este importantă notația Big O?

Notația Big O este o notație matematică folosită pentru a descrie complexitatea de timp sau eficiența în cel mai rău caz a unui algoritm sau complexitatea spațială în cel mai rău caz a unei structuri de date. Acesta oferă o modalitate de a compara performanța diferiților algoritmi și structuri de date și de a prezice modul în care se vor comporta pe măsură ce dimensiunea intrării crește.

Notația O mare este importantă din mai multe motive:

  • Notația Big O este importantă deoarece ajută la analiza eficienței algoritmilor.
  • Oferă o modalitate de a descrie modul în care timpul de rulare sau cerințele de spațiu a unui algoritm crește pe măsură ce dimensiunea intrării crește.
  • Permite programatorilor să compare diferiți algoritmi și să aleagă pe cel mai eficient pentru o anumită problemă.
  • Ajută la înțelegerea scalabilității algoritmilor și la prezicerea modului în care aceștia vor funcționa pe măsură ce dimensiunea intrării crește.
  • Permite dezvoltatorilor să optimizeze codul și să îmbunătățească performanța generală.

Proprietățile notării Big O:

Mai jos sunt câteva proprietăți importante ale notării Big O:

1. Reflexivitate:

Pentru orice funcție f(n), f(n) = O(f(n)).

Exemplu:

f(n) = n2, atunci f(n) = O(n2).

2. Tranzitivitate:

Dacă f(n) = O(g(n)) și g(n) = O(h(n)), atunci f(n) = O(h(n)).

Exemplu:

f(n) = n3, g(n) = n2, h(n) = n4. Atunci f(n) = O(g(n)) și g(n) = O(h(n)). Prin urmare, f(n) = O(h(n)).

3. Factorul constant:

Pentru orice constantă c> 0 și funcții f(n) și g(n), dacă f(n) = O(g(n)), atunci cf(n) = O(g(n)).

Exemplu:

f(n) = n, g(n) = n2. Atunci f(n) = O(g(n)). Prin urmare, 2f(n) = O(g(n)).

4. Regula sumei:

Dacă f(n) = O(g(n)) și h(n) = O(g(n)), atunci f(n) + h(n) = O(g(n)).

Exemplu:

f(n) = n2, g(n) = n3, h(n) = n4. Atunci f(n) = O(g(n)) și h(n) = O(g(n)). Prin urmare, f(n) + h(n) = O(g(n)).

5. Regula produsului:

Dacă f(n) = O(g(n)) și h(n) = O(k(n)), atunci f(n) * h(n) = O(g(n) * k(n)) .

Exemplu:

f(n) = n, g(n) = n2, h(n) = n3, k(n) = n4. Atunci f(n) = O(g(n)) și h(n) = O(k(n)). Prin urmare, f(n) * h(n) = O(g(n) * k(n)) = O(n5).

6. Regula de compunere:

Dacă f(n) = O(g(n)) și g(n) = O(h(n)), atunci f(g(n)) = O(h(n)).

Exemplu:

f(n) = n2, g(n) = n, h(n) = n3. Atunci f(n) = O(g(n)) și g(n) = O(h(n)). Prin urmare, f(g(n)) = O(h(n)) = O(n3).

Notații comune Big-O:

Notația Big-O este o modalitate de a măsura complexitatea în timp și spațiu a unui algoritm. Descrie limita superioară a complexității în cel mai rău caz. Să analizăm diferitele tipuri de complexități de timp:

1. Complexitatea timpului liniar: complexitate mare O(n).

Complexitatea timpului liniar înseamnă că timpul de rulare al unui algoritm crește liniar cu dimensiunea intrării.

De exemplu, luați în considerare un algoritm care traversează o matrice pentru a găsi un anumit element :

Fragment de cod
bool findElement(int arr[], int n, int key) {  for (int i = 0; i < n; i++) {  if (arr[i] == key) {  return true;  }  }  return false; }>

2. Complexitatea timpului logaritmic: complexitate mare O(log n).

Complexitatea timpului logaritmic înseamnă că timpul de rulare al unui algoritm este proporțional cu logaritmul mărimii intrării.

De exemplu, a algoritm de căutare binar are o complexitate de timp logaritmică:

Fragment de cod
int binarySearch(int arr[], int l, int r, int x) {  if (r>= l) { int mid = l + (r - l) / 2;  if (arr[mid] == x) return mid;  if (arr[mid]> x) returnează binarySearch(arr, l, mid - 1, x);  return binarySearch(arr, mid + 1, r, x);  } returnează -1; }>>> 

3. Complexitatea timpului cuadratic: O mare (n2) Complexitate

Complexitatea timpului patratic înseamnă că timpul de rulare al unui algoritm este proporțional cu pătratul mărimii intrării.

De exemplu, un simplu algoritm de sortare cu bule are o complexitate de timp pătratică:

Fragment de codComplexitatea timpului cubic înseamnă că timpul de rulare al unui algoritm este proporțional cu cubul mărimii intrării.

De exemplu, un naiv algoritm de multiplicare a matricei are o complexitate în timp cub:

Fragment de codComplexitatea timpului polinomial se referă la complexitatea timpului a unui algoritm care poate fi exprimat ca o funcție polinomială a mărimii de intrare n . În Big O notație, se spune că un algoritm are complexitate în timp polinomială dacă complexitatea sa în timp este Pe k ) , Unde k este o constantă și reprezintă gradul polinomului.

Algoritmii cu complexitate în timp polinomial sunt în general considerați eficienți, deoarece timpul de rulare crește cu o rată rezonabilă pe măsură ce dimensiunea intrării crește. Exemple comune de algoritmi cu complexitate în timp polinomial includ complexitate liniară în timp O(n) , complexitate de timp pătratică O(n 2 ) , și complexitatea timpului cubic O(n 3 ) .

6. Complexitatea timpului exponențial: O mare (2n) Complexitate

Complexitatea timpului exponențial înseamnă că timpul de rulare al unui algoritm se dublează cu fiecare adăugare la setul de date de intrare.

concat șiruri de caractere java

De exemplu, problema lui generând toate submulțimile unei mulțimi este de complexitate exponențială în timp:

Fragment de cod
void generateSubsets(int arr[], int n) {  for (int i = 0; i < (1 << n); i++) {  for (int j = 0; j < n; j++) {  if (i & (1 << j)) {  cout << arr[j] << ' ';  }  }  cout << endl;  } }>

Complexitate factorială de timp: complexitate mare O(n!).

Complexitatea factorială a timpului înseamnă că timpul de rulare al unui algoritm crește factorial odată cu dimensiunea intrării. Acest lucru este adesea văzut în algoritmii care generează toate permutările unui set de date.

Iată un exemplu de algoritm de complexitate a timpului factorial, care generează toate permutările unui tablou:

Fragment de cod
void permute(int* a, int l, int r) {  if (l == r) {  for (int i = 0; i <= r; i++) {  cout << a[i] << ' ';  }  cout << endl;  }  else {  for (int i = l; i <= r; i++) {  swap(a[l], a[i]);  permute(a, l + 1, r);  swap(a[l], a[i]); // backtrack  }  } }>

Dacă tragem cele mai comune exemple de notație Big O, am avea un grafic ca acesta:

asymtotic-analiza

Cum se determină notația Big O?

Notație O mare este o notație matematică folosită pentru a descrie comportament asimptotic a unei funcții pe măsură ce intrarea acesteia crește infinit de mare. Acesta oferă o modalitate de a caracteriza eficiența algoritmilor și a structurilor de date.

Pași pentru a determina notația Big O:

1. Identificați termenul dominant:

  • Examinați funcția și identificați termenul cu cel mai mare ordin de creștere pe măsură ce dimensiunea intrării crește.
  • Ignorați factorii constanți sau termenii de ordin inferior.

2. Determinați ordinea de creștere:

  • Ordinea de creștere a termenului dominant determină notația Big O.

3. Scrieți notația O mare:

  • Notația Big O este scrisă ca O(f(n)), unde f(n) reprezintă termenul dominant.
  • De exemplu, dacă termenul dominant este n^2, notația Big O ar fi O(n^2).

4. Simplificați notația (Opțional):

  • În unele cazuri, Brandul Big O n poate fi simplificat prin eliminarea factorilor constanți sau prin utilizarea unei notații mai concise.
  • De exemplu, O(2n) poate fi simplificat la Pe).

Exemplu:

bara de instrumente cu acces rapid Word

Funcția: f(n) = 3n3+ 2n2+ 5n + 1

  1. Termen dominant: 3n3
  2. Ordine de creștere: cubic (n3)
  3. Notație O mare: O(n3)
  4. Notație simplificată: O(n3)

Exemple matematice de analiză în timp de rulare:

Tabelul de mai jos ilustrează analiza timpului de rulare a diferitelor ordine de algoritmi pe măsură ce mărimea intrării (n) crește.

njurnal(n)nn * log(n)n^22^nn!
101101010010243628800
douăzeci2.996douăzeci59,940010485762.432902e+1818

Exemple algoritmice de analiză a timpului de rulare:

Tabelul de mai jos clasifică algoritmii în funcție de complexitatea lor de rulare și oferă exemple pentru fiecare tip.

TipNotaţieExemple de algoritmi
LogaritmicO(log n)Căutare binară
LiniarPe)Căutare liniară
SuperliniarO(n log n)Sortare în grămada, Sortare îmbinare
PolinomO(n^c)Înmulțirea matricei lui Strassen, sortarea cu bule, sortarea selecției, sortarea inserției, sortarea găleții
ExponenţialO(c^n)Turnul din Hanoi
FactorialăPe!)Expansiunea determinantă de către minori, algoritmul de căutare cu forță brută pentru problema vânzătorului ambulant

Clase de algoritm cu număr de operații și timp de execuție:

Mai jos sunt clasele de algoritmi și timpii lor de execuție pe un computer care se execută 1 milion de operații pe secundă (1 sec = 10 6 μsec = 10 3 msec) :

Clasele de notație Big O

f(n)

Analiza Big O (număr de operații) pentru n = 10

Timp de execuție (1 instrucțiune/μsec)

constant

O(1)

1

1 μsec

logaritmică

O(logn)

3.32

3 μsec

liniar

Pe)

10

10 μsec

O(nlogn)

O(nlogn)

33.2

33 μsec

pătratică

Pe2)

102

100 μsec

cub

Pe3)

103

1 msec

exponenţială

O(2n)

1024

10 msec

factorial

Pe!)

10!

3,6288 sec

Comparație între notația Big O, Big Ω (Omega) și Big θ (Theta):

Mai jos este un tabel care compară notația Big O, notația Ω (Omega) și notația θ (Theta):

npm cache curat
NotaţieDefinițieExplicaţie
O mare (O)f(n) ≤ C * g(n) pentru toate n ≥ n0Descrie limita superioară a timpului de rulare a algoritmului în cel mai rău caz .
Ω (Omega)f(n) ≥ C * g(n) pentru toate n ≥ n0Descrie limita inferioară a timpului de rulare a algoritmului în cel mai bun caz .
θ (Theta)C1* g(n) ≤ f(n) ≤ C2* g(n) pentru n ≥ n0Descrie atât limitele superioare, cât și inferioare ale algoritmului timpul pentru alergat .

În fiecare notație:

  • f(n) reprezintă funcția analizată, de obicei complexitatea temporală a algoritmului.
  • g(n) reprezintă o funcție specifică care limitează f(n) .
  • C, C1, și C2 sunt constante.
  • n 0 este dimensiunea minimă a intrării dincolo de care este valabilă inegalitatea.

Aceste notații sunt folosite pentru a analiza algoritmi pe baza lor cel mai rău caz (O mare) , cel mai bun caz (Ω) , și caz mediu (θ) scenarii.

Întrebări frecvente despre Big O Notation:

Întrebarea 1. Ce este Big O Notation?

Răspuns: Big O Notation este o notație matematică folosită pentru a descrie limita superioară a complexității timpului unui algoritm în ceea ce privește modul în care crește în raport cu dimensiunea intrării.

Întrebarea 2. De ce este importantă notația Big O?

Răspuns: Ne ajută să analizăm și să comparăm eficiența algoritmilor, concentrându-ne pe cel mai rău scenariu și înțelegerea modului în care performanța lor se scalează în funcție de dimensiunea intrării.

Întrebarea 3. Cum se calculează Big O Notation?

Răspuns: Notația Big O este determinată prin identificarea operației dominante într-un algoritm și exprimând complexitatea sa de timp în termeni de n, unde n reprezintă dimensiunea intrării.

Întrebarea 4. Ce înseamnă O(1) în notația Big O?

Răspuns: O(1) semnifică o complexitate constantă în timp, indicând faptul că timpul de execuție al unui algoritm nu se modifică indiferent de dimensiunea intrării.

Întrebarea 5. Care este semnificația diferitelor complexități Big O precum O(log n) sau O(n^2)?

Răspuns: Diferitele complexități precum O(log n) sau O(n^2) reprezintă modul în care performanța unui algoritm crește pe măsură ce dimensiunea intrării crește, oferind informații despre eficiența și scalabilitatea acestuia.

Întrebarea 6. Notația Big O poate fi aplicată și complexității spațiului?

Răspuns: Da, Big O Notation poate fi folosită și pentru a analiza și a descrie complexitatea spațiului unui algoritm, indicând câtă memorie are nevoie în raport cu dimensiunea de intrare.

Articol înrudit: