(poiché questa è una risposta più lunga, leggi i grassetti per un riepilogo )
Facciamo il tuo esempio e lo esaminiamo passo dopo passo, comprendendo lo scopo dietro ciò che stiamo facendo. Iniziamo con la tua funzione e l'obiettivo di trovare la sua notazione Big Oh:
f(n) = 6n+4
In primo luogo, lasciare che O(g(n))
sia il Big Oh notazione che stiamo cercando di trovare per f(n)
. Dalla definizione di Big Oh, dobbiamo trovare un semplificato in g(n)
cui esistono alcune costanti c
e n0
dove c*g(n) >= f(n)
è vero per tutto ciò che n
è maggiore di n0
.
Innanzitutto, scegliamo g(n) = 6n + 4
(che cederebbe O(6n+4)
in Big Oh). In questo caso vediamo che c = 1
e qualsiasi valore di n0
soddisferà i requisiti matematici dalla nostra definizione di Big Oh, poiché è g(n)
sempre uguale a f(n)
:
c*g(n) >= f(n)
1*(6n + 4) >= 6n + 4 //True for all n's, so we don't need to pick an n0
A questo punto abbiamo soddisfatto i requisiti matematici. Se ci fermassimo aO(6n+4)
, è chiaro che questo non è più utile della scrittura f(n)
, quindi mancherebbe il vero scopo della notazione Big Oh: capire la complessità temporale generale di un algoritmo! Passiamo quindi al passaggio successivo: la semplificazione.
Innanzitutto, possiamo semplificare 6n
così come è il Big Oh O(4)
? No! (Esercizio per il lettore se non capiscono perché)
In secondo luogo, possiamo semplificare il 4
modo in cui il Big Oh lo è O(6n)
? Sì! In tal caso g(n) = 6n
, quindi:
c*g(n) >= f(n)
c*6n >= 6n + 4
A questo punto, scegliamo c = 2
da allora il lato sinistro aumenterà più velocemente (di 12) rispetto al lato destro (di 6) per ogni incremento di n
.
2*6n >= 6n + 4
Ora dobbiamo trovare un positivo in n0
cui l'equazione sopra è vera per tutti n
i valori superiori a quel valore. Dato che sappiamo già che il lato sinistro sta aumentando più rapidamente di quello destro, tutto ciò che dobbiamo fare è trovare una soluzione positiva. Quindi, poiché n0 = 2
ciò che è vero è vero, lo sappiamo g(n)=6n
, o O(6n)
è una potenziale notazione per Big Oh f(n)
.
Ora, possiamo semplificare il 6
modo in cui il Big Oh è O(n)
? Sì! In tal caso g(n) = n
, quindi:
c*g(n) >= f(n)
c*n >= 6n + 4
Selezioniamo c = 7
poiché la sinistra aumenterebbe più rapidamente della destra.
7*n >= 6n + 4
Vediamo che quanto sopra sarà vero per tutto ciò che n
è maggiore o uguale a n0 = 4
. Quindi, O(n)
è una potenziale notazione Big Oh per f(n)
. Possiamo semplificare g(n)
più? No!
Infine, abbiamo scoperto che la più semplice notazione per Big Oh f(n)
è O(n)
. Perché abbiamo passato tutto questo? Perché ora sappiamo che f(n)
è lineare , poiché la notazione Big Oh è di complessità lineare O(n)
. La cosa bella è che ora possiamo confrontare la complessità temporale di f(n)
altri algoritmi! Per esempio, ora sappiamo che f(n)
è di paragonabile nel tempo la complessità delle funzioni h(n) = 123n + 72
, i(n) = n
, j(n) = .0002n + 1234
, ecc; perché usando lo stesso processo di semplificazione descritto sopra hanno tutti una complessità temporale lineare di O(n)
.
Dolce!!!