In parole povere, la complessità temporale è un modo per riassumere come il numero di operazioni o il tempo di esecuzione di un algoritmo aumenta all'aumentare della dimensione dell'input.
Come la maggior parte delle cose nella vita, un cocktail party può aiutarci a capire.
SU)
Quando arrivi alla festa, devi stringere la mano a tutti (fai un'operazione su ogni oggetto). All'aumentare del numero di partecipanti N
, aumenta il tempo / lavoro necessario per stringere la mano a tuttiO(N)
.
Perché O(N)
e no cN
?
C'è una variazione nella quantità di tempo necessaria per stringere la mano alle persone. Potresti calcolare la media e catturarlo in una costante c
. Ma l'operazione fondamentale qui --- stringere la mano a tutti --- sarebbe sempre proporzionale O(N)
, qualunque cosa c
fosse. Quando discutiamo se dovremmo andare ad un cocktail party, siamo spesso più interessati al fatto che dovremo incontrare tutti che nei minimi dettagli di come sono quegli incontri.
O (N ^ 2)
L'ospite del cocktail party vuole che tu faccia un gioco stupido in cui tutti incontrano tutti gli altri. Pertanto, devi incontrare N-1
altre persone e, poiché la persona successiva ti ha già incontrato, devono incontrare altre N-2
persone e così via. La somma di questa serie è x^2/2+x/2
. Con l'aumentare del numero di partecipanti, il x^2
termine diventa molto veloce , quindi lasciamo cadere tutto il resto.
O (N ^ 3)
Devi incontrare tutti gli altri e, durante ogni incontro, devi parlare di tutti gli altri nella stanza.
O (1)
L'host vuole annunciare qualcosa. Bevono un bicchiere di vino e parlano ad alta voce. Tutti li ascoltano. Si scopre che non importa quanti partecipanti ci siano, questa operazione richiede sempre lo stesso tempo.
O (registro N)
L'host ha presentato tutti al tavolo in ordine alfabetico. Dov'è Dan? Pensi che debba essere da qualche parte tra Adam e Mandy (certamente non tra Mandy e Zach!). Detto questo, è tra George e Mandy? No. Deve essere tra Adam e Fred, e tra Cindy e Fred. E così via ... possiamo localizzare in modo efficiente Dan guardando metà del set e poi metà di quel set. Alla fine, guardiamo O (log_2 N) individui.
O (N log N)
Puoi trovare dove sederti al tavolo usando l'algoritmo sopra. Se un gran numero di persone venisse al tavolo, uno alla volta, e tutti lo facessero, ciò richiederebbe O (N log N) . Questo risulta essere il tempo necessario per ordinare qualsiasi raccolta di articoli quando devono essere confrontati.
Caso migliore / peggiore
Arrivi alla festa e devi trovare Inigo: quanto tempo ci vorrà? Dipende da quando arrivi. Se tutti si aggirano, hai colpito il caso peggiore: ci vorrà del O(N)
tempo. Tuttavia, se tutti sono seduti al tavolo, ci vorrà soloO(log N)
tempo. O forse puoi sfruttare il potere urlante del bicchiere di vino dell'host e ci vorrà soloO(1)
tempo.
Supponendo che l'host non sia disponibile, possiamo dire che l'algoritmo di individuazione di Inigo ha un limite inferiore di O(log N)
e un limite superiore diO(N)
, a seconda dello stato della parte al momento dell'arrivo.
Spazio e comunicazione
Le stesse idee possono essere applicate per comprendere come gli algoritmi usano lo spazio o la comunicazione.
Knuth ha scritto un bel articolo sull'ex intitolato "The Complexity of Songs" .
Teorema 2: Esistono canzoni arbitrariamente lunghe di complessità O (1).
PROVA: (grazie a Casey e alla Sunshine Band). Considera le canzoni Sk definite da (15), ma con
V_k = 'That's the way,' U 'I like it, ' U
U = 'uh huh,' 'uh huh'
per tutti i k.