(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 !!!