(poiché questa è una risposta più lunga, leggi i grassetti per un sommario )
Prendiamo il tuo esempio e seguilo passo 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
Innanzitutto, lascia che O(g(n))
sia la notazione Big Oh che stiamo cercando di trovare per f(n)
. Dalla definizione di Big Oh, dobbiamo trovare un semplificato g(n)
dove esistono alcune costanti c
e n0
dove c*g(n) >= f(n)
è vero per tutto n
' s maggiore di n0
.
Per prima cosa, scegliamo g(n) = 6n + 4
(che renderebbe O(6n+4)
in Big Oh). In questo caso vediamo che c = 1
e qualsiasi valore di n0
soddisferanno 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 fermiamo a O(6n+4)
, è chiaro che non è più utile della scrittura di f(n)
, quindi perderebbe il vero scopo della notazione di Big Oh: capire il tempo generale- complessità di un algoritmo! Quindi, passiamo al prossimo passo: semplificazione.
Innanzitutto, possiamo semplificare il 6n
in modo che Big Oh sia O(4)
? No! (Esercizio per il lettore se non capiscono perché)
Secondo, possiamo semplificare la 4
in modo che Big Oh sia 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 n0
positivo in cui l'equazione precedente è vera per tutto n
's maggiore di quel valore. Poiché sappiamo già che il lato sinistro sta aumentando più velocemente del giusto, tutto ciò che dobbiamo fare è trovare una soluzione positiva. Pertanto, poiché n0 = 2
rende vero quanto sopra, sappiamo che g(n)=6n
, o O(6n)
è una potenziale notazione Big Oh per f(n)
.
Ora, possiamo semplificare la 6
in modo che Big Oh sia 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ù velocemente della destra.
7*n >= 6n + 4
Vediamo che quanto sopra sarà vero per tutto n
's maggiore o uguale a n0 = 4
. Pertanto, O(n)
è una potenziale notazione di Big Oh per f(n)
. Possiamo semplificare più g(n)
? No!
Infine, abbiamo rilevato che la notazione Big Oh più semplice per f(n)
è O(n)
. Perché abbiamo affrontato tutto questo? Poiché 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)
con altri algoritmi! Ad esempio, ora sappiamo che f(n)
è di complessità temporale paragonabile alle funzioni h(n) = 123n + 72
, i(n) = n
, j(n) = .0002n + 1234
, ecc; poiché utilizzando lo stesso processo di semplificazione descritto sopra, tutti hanno una complessità temporale lineare di O(n)
.
dolce !!!