Complessità: asintotica

Dopo aver analizzato la complessità in tempo di alcuni algoritmi possiamo osservare che

  1. il caso ottimo di un algoritmo è quasi sempre costante
  2. non sarebbe significativo per la bassa probabilità che ha di presentarsi
  3. il caso pessimo e il caso medio dipendono dalla dimensione dei dati
  4. è difficile calcolare con precisione le costanti moltiplicative
  5. per n piccolo è difficile decidere tra due algoritmi
  6. per n abbastanza grande la differenza di comportamento diventa evidente

Per dare una misura della complessità in tempo di un algoritmo si preferisce

  • dare una misura approssimata del calcolo del tempo di esecuzione T(n)
  • studiare il caso pessimo oppure il caso medio
  • valutare il comportamento per n sufficientemente grande… si introduce la complessità asintotica

Definizione

Una funzione g(n) è O(f(n)), e si legge g(n) è dell’ordine o grande di f(n), se esistono una costante moltiplicativa c ed un numero naturale n_0 tali che g(n)\leq c\cdot f(n) per una certa c e per ogni n > n_0

Esempio

Data la funzione g(n)=2 n^2 + 4 n + 2, scegliendo opportunamente i valori (c=3, n_0 > 5) si ha

g(5) = 72 < 75 = 3\cdot (5)^2

allora g(n)\leq c\cdot f(n) per n \geq 5 e quindi g(n) \in O(n^2)

In pratica

  • le costanti moltiplicative diventano trascurabili
  • le combinazioni lineari di funzioni diventano trascurabili
  • è sufficiente individuare la funzione più pesante
  • tutte le funzioni costanti sono dell’ordine O(1)
  • tutte le funzioni lineari sono dell’ordine O(n)
  • tutte le funzioni quadratiche sono dell’ordine O(n^2)

La complessità in tempo viene riassunta in una funzione più significativa che rappresenta la complessità in tempo asintotica.

Esempi

Le costanti moltiplicative sono volutamente sbilanciate per evidenziare l’aspetto asintotico… della complessità

  • T_1(n) = 2\cdot n + 400\cdot \log_2 n \in O(n)
  • T_2(n) = 2\cdot n^3 + 400\cdot n \in O(n^3)
  • T_3(n) = 20000 + \log_{10}n \in O(\log n), rifletti…
  • T_4(n) = 3^n + 400\cdot n^4 + 100000 \in O(3^n)

Elenco

Per tutte le semplificazioni che abbiamo adottato le funzioni di complessità veramente interessanti in ambito informatico sono poche

O(1)CostanteAssegnazione…
O(\log\log n)Sottologaritmica, meno di logaritmica
O(\log n)LogaritmicaRicerca binaria
O(n^k), 0 < k < 1Sottolineare, meno di lineare, \sqrt{n}
O(n)LineareRicerca sequenziale
O(n \log n)Enne-log-enneAlgoritmi di ordinamento evoluti
O(n^k), 1 < k < 2Meno di quadraticaAlgoritmi di ordinamento intermedi
O(n^2)QuadraticaAlgoritmi di ordinamento ingenui
O(n^k), 2 < k < 3Meno di cubica
O(n^3)CubicaProdotto di matrici scolastico
O(n^k), k ≥ 3Polinomiale
O(2^n)Esponenziale, con base 2Torre di Hanoi
O(k^n)Esponenziale, con base k > 1Password
O(n!)Fattoriale, più che esponenziale…Anagrammi
O(n^n)Più che esponenziale…