(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 ce n0dove 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 = 1e qualsiasi valore di n0soddisferà 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 6ncosì come è il Big Oh O(4)? No! (Esercizio per il lettore se non capiscono perché)
In secondo luogo, possiamo semplificare il 4modo 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 = 2da 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 n0cui l'equazione sopra è vera per tutti ni 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 = 2ciò che è vero è vero, lo sappiamo g(n)=6n, o O(6n)è una potenziale notazione per Big Oh f(n).
Ora, possiamo semplificare il 6modo 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 = 7poiché 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!!!