Traduzioni di questa pagina?:

Time Complexity

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:

NoneVelocitàDescrizioneFormulaEsempio
tempo fattorialemolto lentoimpiega un tempo proporzionale a N elevato alla N-esima potenza N! Soluzione a “forza bruta” del problema del “commesso viaggiatore”
tempo esponenzialelentoimpiega un tempo proporzionale ad una costante elevata all'N-esima potenza KN Soluzione a forza bruta del Cubo di Rubik
tempo polinomialeveloce impiega un tempo proporzionale ad N elevato a qualche potenza costante NK Ordinamento per confronto (bubble sort, insertion, selection sort)
tempo “linearitmico”molto veloceimpiega un tempo nella regione tra lineare e polinomiale N*log(N) Ordinamenti logaritmici lineari (quicksort, heapsort, mergesort)
tempo linearesuperveloceimpiega un tempo proporzionale ad N K*N Iterazione attraverso un array
tempo logaritmicovelocissimoimpiega un tempo proporzionale al logaritmo di N K*log(N) Ricerca binaria
tempo costanteidealeimpiega un tempo costante indipendentemente dall'input K lookup tramite indice di un elemento in un array

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:

NameDescriptionExample
best-caseUn caso dove l'operazione esegue il più velocemente possibile Il “bubblesort” ha una complessita di best-case dell'ordine di N
average-caseUn 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-caseUn caso dove l'operazione esegue nel modo più lentoIl Quicksort ha una complessitù di worst-case di N2
amortized worst-caseLa 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.