(dado que esta es una respuesta más larga, lea las negrillas para obtener un resumen )
Tomemos su ejemplo y avancemos paso a paso, entendiendo el propósito detrás de lo que estamos haciendo. Comenzamos con su función y el objetivo de encontrar su notación Big Oh:
f(n) = 6n+4
Primero, seamos O(g(n))
la notación Big Oh que estamos tratando de encontrar f(n)
. A partir de la definición de Big Oh, necesitamos encontrar un simplificado g(n)
donde existan algunas constantes c
y n0
donde c*g(n) >= f(n)
sea cierto para todos n
los mayores que n0
.
Primero, elijamos g(n) = 6n + 4
(lo que daría lugar O(6n+4)
en Big Oh). En este caso, vemos que c = 1
y cualquier valor de n0
cumplirá con los requisitos matemáticos de nuestra definición de Big Oh, ya que g(n)
siempre es igual 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
En este punto, hemos cumplido los requisitos matemáticos. Si nos detenemosO(6n+4)
, está claro que esto no es más útil que escribir f(n)
, por lo que perdería el verdadero propósito de la notación Big Oh: ¡comprender la complejidad temporal general de un algoritmo! Por lo tanto, pasemos al siguiente paso: la simplificación.
Primero, ¿podemos simplificar de 6n
modo que el Big Oh es O(4)
? ¡No! (Ejercicio para el lector si no entiende por qué)
En segundo lugar, ¿podemos simplificar 4
para que el Big Oh sea O(6n)
? ¡Si! En ese caso g(n) = 6n
, entonces:
c*g(n) >= f(n)
c*6n >= 6n + 4
En este punto, elijamos c = 2
desde entonces que el lado izquierdo aumentará más rápido (en 12) que el lado derecho (en 6) para cada incremento de n
.
2*6n >= 6n + 4
Ahora necesitamos encontrar un punto positivo n0
donde la ecuación anterior sea verdadera para todos n
los valores superiores a ese valor. Como ya sabemos que el lado izquierdo aumenta más rápido que el derecho, todo lo que tenemos que hacer es encontrar una solución positiva. Por lo tanto, dado que n0 = 2
hace que lo anterior sea cierto, lo sabemos g(n)=6n
o O(6n)
es una notación potencial de Big Oh f(n)
.
Ahora, ¿podemos simplificar 6
para que el Big Oh sea O(n)
? ¡Si! En ese caso g(n) = n
, entonces:
c*g(n) >= f(n)
c*n >= 6n + 4
Vamos a elegir c = 7
ya que la izquierda aumentaría más rápido que la derecha.
7*n >= 6n + 4
Vemos que lo anterior será cierto para todos n
los mayores o iguales a n0 = 4
. Por lo tanto, O(n)
es una notación potencial para Big Oh f(n)
. ¿Podemos simplificar g(n)
más? No!
Finalmente, hemos descubierto que la notación Big Oh más simple f(n)
es O(n)
. ¿Por qué pasamos por todo esto? Porque ahora sabemos que f(n)
es lineal , ya que su notación Big Oh es de complejidad lineal O(n)
. ¡Lo bueno es que ahora podemos comparar la complejidad temporal de f(n)
otros algoritmos! Por ejemplo, ahora sabemos que f(n)
es comparable de tiempo-complejidad de las funciones h(n) = 123n + 72
, i(n) = n
, j(n) = .0002n + 1234
, etc; porque al usar el mismo proceso de simplificación descrito anteriormente, todos tienen una complejidad lineal de tiempo O(n)
.
¡¡¡Dulce!!!