Time Complexity

Da cppreference.com.
< cpp


Ci sono differenti misure della velocità di un algoritmo. Se la dimensione dell'input di un algoritmo è N la velocità di elaborazione viene descritta nei seguenti modi:

None Velocità Descrizione Formula Esempio
tempo fattoriale molto lento impiega un tempo proporzionale a N elevato alla N-esima potenza N! Soluzione a "forza bruta" del problema del "commesso viaggiatore"
tempo esponenziale lento impiega un tempo proporzionale ad una costante elevata all'N-esima potenza KN Soluzione a forza bruta del Cubo di Rubik
tempo polinomiale veloce impiega un tempo proporzionale ad N elevato a qualche potenza costante NK Ordinamento per confronto (bubble sort, insertion, selection sort)
tempo "linearitmico" molto veloce impiega un tempo nella regione tra lineare e polinomiale N*log(N) Ordinamenti logaritmici lineari (quicksort, heapsort, mergesort)
tempo lineare superveloce impiega un tempo proporzionale ad N K*N Iterazione attraverso un array
tempo logaritmico velocissimo impiega un tempo proporzionale al logaritmo di N K*log(N) Ricerca binaria
tempo costante ideale impiega un tempo costante indipendentemente dall'input K lookup tramite indice di un elemento in un array

[modifica]Analisi della complessità

Un'operazione data può avere diverse complessità a seconda dell'ordine e del tipo di input. I diversi metodi di determinazione nell'analisi della complessità temporale sono i seguenti:

Name Description Example
best-case Un caso dove l'operazione esegue il più velocemente possibile Il "bubblesort" ha una complessita di best-case dell'ordine di N
average-case Un caso dove l'operazione esegue in tempo confrontabile con quello della maggiranza dei casi possibili Il Quicksort ha una complessità di average-case di N * log(N)
worst-case Un caso dove l'operazione esegue nel modo più lento Il Quicksort ha una complessitù di worst-case di N2
amortized worst-case La stima della media del worst-case presa su un infinito numero di input vector::push_back() ha un amortized worst-case di K (constant time)

Scegliere l'algoritmo giusto dipende da quali casi vi aspettate di incontrare nella vostra applicazione. Per esempio un applicazione che deve proteggersi da input "malicious" dovrà evitare implementazioni "semplici" del quicksort, che ha una complessità di worst-time di N2, nonostante abbia una delle più veloci esecizioni in average-case rispetto agli altri sort.

close