La notazione Big Oh (O, Theta, Omega) riguarda i tassi di crescita delle funzioni.
Quando si implementa un algoritmo, ha una certa caratteristica su come cambia il runtime quando si aumenta il set di dati. Ora, puoi ottimizzare l'algoritmo in modo che funzioni più velocemente di un fattore 100. Certo, questo è fantastico, ma essenzialmente è sempre lo stesso algoritmo. Allo stesso modo, in pochi anni, i computer potrebbero essere due volte più veloci di oggi.
La notazione Landau estrae questi fattori costanti. Non importa se un algoritmo f
è sempre due volte più veloce di un altro algoritmo g
: forse g
può essere ottimizzato per funzionare 4 volte più velocemente, oppure potresti invece acquistare hardware più veloce. Se lo guardi da questa prospettiva, potresti dire che sono "uguali". (Questo non vuol dire che puoi (sempre) ignorare i fattori costanti nella pratica.)
Big oh specifica un limite superiore, è simile alla <=
relazione.
Concorderai che 1 < 2
è vero. Ciò significa che 1
non può essere inferiore a qualsiasi altro numero? Certamente no. C'è un numero infinito di numeri che sono più grandi di 1
.
Con i tassi di crescita, è simile. O(n)
indica l'insieme di tutte le funzioni, che crescono linearmente (o più lentamente). O(n^2)
d'altra parte indica tutte quelle funzioni, che crescono con una compattezza quadratica (o più lenta). Sono sicuro che concorderai sul fatto che una funzione lineare cresce più lentamente di una funzione quadratica.
Ecco perché una funzione può essere in più di una classe "Big-oh".
Ecco un confronto di diverse funzioni con : (dalla matematica di Knuth's Concrete)
Da sinistra a destra, le funzioni crescono più velocemente.
Inoltre, significa che n ^ 2 cresce più velocemente di n ^ 1 perché 2> 1.
definizioni
"f cresce più velocemente o altrettanto velocemente di g"
"f cresce più lentamente o altrettanto velocemente di g"
La combinazione dei due precedenti. Dice che la funzione f
cresce "altrettanto velocemente" come g
. È una relazione di equivalenza.
Interpretazione
Diciamo che hai due algoritmi f
e g
.
Omega
Supponendo , significa che, indipendentemente dal budget, non esiste una quantità costante di potenza di calcolo che è possibile aggiungere al sistema, in modo tale da f
funzionare sempre più velocemente g
.
Grande oh
Supponendo , significa che se hai abbastanza dati, f
funzionerà sempre più velocemente di g
, indipendentemente dalla potenza di elaborazione che aggiungi al tuo sistema.
Prova
Se stai davvero cercando di dimostrarlo, devi dimostrare usando le definizioni della notazione Landau che la tua funzione soddisfa le condizioni necessarie.
Quindi è necessario trovare i valori per c
, d
, n_0
in modo tale che la condizione detiene.
Ecco come puoi farlo per il limite inferiore con c
:
È importante rendersi conto che io definisco arbitrariamente c
come più piccolo di quanto a-1
vada perfettamente bene. La definizione di Theta (g) dice che "esiste un c
". Può essere qualsiasi valore purché sia maggiore di 0. (Se a
è un numero reale positivo, tuttavia, è necessario modificare leggermente la prova, poiché a - 1
potrebbe essere effettivamente negativo)
(Sto assumendo a
di essere positivo, altrimenti la funzione sarà sempre negativa per grandi valori di n
, il che non ha senso per una funzione che indica il runtime.)
Puoi provare a farlo per il limite superiore, è abbastanza simile. Se non sai come fare, posso fornirti una prova.
Suggerimento: iniziare con d > a + 1
Attenzione
È importante non dimostrarlo nel modo sbagliato. Se supponi che (an + b) sia in O (n) e passi da lì, non hai dimostrato ciò che volevi. Dovrai verificare che tutti i tuoi passaggi procedano in entrambe le direzioni, ovvero invece di =>
te <=>
.