(como essa é uma resposta mais longa, leia os negritos para obter um resumo )
Vamos dar o seu exemplo e seguir passo a passo, entendendo o propósito por trás do que estamos fazendo. Começamos com sua função e o objetivo de encontrar sua notação Big Oh:
f(n) = 6n+4
Primeiro, vamos O(g(n))
ser o Big Oh notação estamos tentando encontrar para f(n)
. A partir da definição de Big Oh, precisamos encontrar um simplificado g(n)
onde existam algumas constantes c
e n0
onde c*g(n) >= f(n)
seja verdade para todos n
maiores que n0
.
Primeiro, vamos escolher g(n) = 6n + 4
(o que renderia O(6n+4)
em Big Oh). Nesse caso, vemos que c = 1
e qualquer valor de n0
atenderá aos requisitos matemáticos de nossa definição de Big Oh, pois g(n)
sempre é 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
Neste ponto, atendemos aos requisitos matemáticos. Se parássemosO(6n+4)
, fica claro que isso não é mais útil do que escrever f(n)
, portanto , perderia o verdadeiro objetivo da notação Big Oh: entender a complexidade geral de tempo de um algoritmo! Assim, vamos para o próximo passo: simplificação.
Primeiro, podemos simplificar o 6n
que o Big Oh é O(4)
? Não! (Exercite para o leitor se ele não entender o porquê)
Segundo, podemos simplificar o 4
que é o Big Oh O(6n)
? Sim! Nesse caso g(n) = 6n
, então:
c*g(n) >= f(n)
c*6n >= 6n + 4
Neste ponto, vamos escolher c = 2
desde então o lado esquerdo aumentará mais rápido (em 12) do que o lado direito (em 6) para cada incremento de n
.
2*6n >= 6n + 4
Agora precisamos encontrar um positivo em n0
que a equação acima seja verdadeira para todos que n
são maiores que esse valor. Como já sabemos que o lado esquerdo está aumentando mais rapidamente que o direito, tudo o que precisamos fazer é encontrar uma solução positiva. Assim, uma vez que n0 = 2
torna o exposto acima verdade, sabemos que g(n)=6n
, ou O(6n)
é uma notação potencial do Big Oh para f(n)
.
Agora, podemos simplificar o 6
que é o Big Oh O(n)
? Sim! Nesse caso g(n) = n
, então:
c*g(n) >= f(n)
c*n >= 6n + 4
Vamos escolher, c = 7
pois a esquerda aumentaria mais rápido que a direita.
7*n >= 6n + 4
Vemos que o acima exposto será verdadeiro para todos n
maiores ou iguais a n0 = 4
. Assim, O(n)
é uma notação potencial do Big Oh para f(n)
. Podemos simplificar g(n)
mais? Não!
Finalmente, descobrimos que a notação Big Oh mais simples f(n)
é O(n)
. Por que passamos por tudo isso? Porque agora sabemos que f(n)
é linear , pois a notação Big Oh é de complexidade linear O(n)
. O bom é que agora podemos comparar a complexidade de tempo f(n)
com outros algoritmos! Por exemplo, sabemos agora que f(n)
é de comparável tempo a complexidade das funções h(n) = 123n + 72
, i(n) = n
, j(n) = .0002n + 1234
, etc; porque, usando o mesmo processo de simplificação descrito acima, todos eles têm uma complexidade de tempo linear de O(n)
.
Doce!!!