Big O Notation
Definição
Quando se estuda algoritmos, é comum ouvir dois termos, time complexity e space complexity. Eles se referem respectivamente à quantidade de tempo que um algoritmo leva para ser concluído e à quantidade de memória utilizada para concluir um algoritmo dado input de tamanho N.
Big O Notation é uma notação para analisarmos tanto a time complexity quanto a space complexity de um algoritmo, dentre muitas outras, geralmente considerando o pior cenário. É importante conhecer Big O para entendermos a performance de um algoritmo, quanto para melhorá-lo.

Complexidades Mais Comuns
Pense no valor dentro de parênteses como a quantidade de vezes em que seu algoritmo será executado a depender do tamanho do seu input.
Nesse caso, O (1) é tempo constante, sempre vai levar a mesma quantidade de tempo independente do input. Um exemplo de um algoritmo de tempo constante é uma simples operação matemática:
def sum(n):
return n * 2
Ou seja, O (log N) trata-se de um algoritmo que dado um input será executado literalmente log(N) vezes, o que é muito devagar, log(1000000) é cerca de apenas 20 execuções! Um algoritmo bem famoso que é O (log N) é a busca binária.
O (N) é um algoritmo de tempo linear, ou seja, cresce linearmente com o tamanho do input, um clássico for loop percorrendo um array de tamanho N por exemplo:
for i in n:
print(i)
O (K log N) é um algoritmo que vai ser executado K * log (N), por exemplo, fazer K buscas binárias.
O (N^2) é uma complexidade de tempo quadrática, ou seja, para o input N, será executado Nˆ2 vezes.
for i in range(1, N + 1):
for j in range(1, N + 1):
print(i, j)
O (2^N) é um algoritmo, literalmente, exponencial, cresce insanamente rápido.
def Fib(n):
if n == 0 or n == 1:
return 1
return Fib(n - 1) + Fib(n - 2)
O (N!) cresce ainda insanamente mais rápido do que um complexidade de tempo exponencial.
Last updated