#programacao
Notação
BIG O
O(bicho de sete cabeças)
@dev.conde
Notação BIG O #programacao
O que é BIG O?
É uma notação baseada no conceito
matemático chamado Análise
Assintótica (que basicamente analisa
números gigantes).
A notação BIG O é usada para medir a
eficiência do algoritmo.
Note que usamos o termo eficiência,
pois mais do que analisar o tempo de
execução de um algoritmo, é
necessário entender o quanto o tempo
irá aumentar conforme a entrada
aumenta.
@dev.conde
Notação BIG O #programacao
Complexidades
@dev.conde
Notação BIG O #programacao
Tipos de complexidade
O(1) - constante
O(log n) - logarítmica
O(n) - linear
O(n log n) - log linear
O(n²) - quadrático
O(2^n) - exponencial
@dev.conde
Notação BIG O #programacao
Pior cenário
Importante salientar que a notação
BIG O é sempre para considerar o pior
cenário possível. Em uma lista de 1
milhão de elementos, precisamos
considerar o pior cenário dela.
@dev.conde
Notação BIG O #programacao
Constante O(1)
É quando não há um looping no
algoritmo. Ou seja, não depende do
tamanho da entrada.
@dev.conde
Notação BIG O #programacao
Constante O(1)
Nesse código estamos acessando
diretamente o primeiro elemento do
array. Quando acessamos pelo índice é
um operação constante. Não importa a
quantidade de elementos no array.
@dev.conde
Notação BIG O #programacao
Logarítmica O(log n)
Primeiro precisamos entender o que é
um logaritmo:
Matematicamente, um logaritmo
responde a pergunta: "A qual potência
devo elevar uma base b para obter
um número n?"
Dividir para conquistar.
@dev.conde
Notação BIG O #programacao
Logarítmica O(log n)
Um exemplo para a notação O(log n) é
a busca binária:
O tamanho da lista é reduzido pela
metade a cada iteração.
Para uma lista de 16 elementos, são
necessários 4 passos no pior caso
log2(16) = 4
@dev.conde
Notação BIG O #programacao
Logarítmica O(log n)
@dev.conde
Notação BIG O #programacao
Linear O(n)
A complexidade linear ocorre quando
o tempo de execução de um algoritmo
cresce proporcionalmente ao tamanho
da entrada.
Então quando temos uma lista com n
de entrada para obter o número
desejado, deverá percorrer ela por
inteiro, ou seja n vezes.
@dev.conde
Notação BIG O #programacao
Linear O(n)
Nesse exemplo, o método calcular
percorre todos os elementos do array
para realizar a soma deles.
@dev.conde
Notação BIG O #programacao
Log Linear O(n log n)
O log linear indica que o algoritmo
cresce de forma logaritmica (log n) em
relação ao tamanho da entrada (n).
Normalmente esse algoritmo é
chamado de forma recursiva, onde a
cada nível da recursão os elementos
são visitados uma vez.
@dev.conde
Notação BIG O #programacao
Log Linear O(n log n)
Algoritmos de ordenação eficiente que
utilizam a complexidade Log Linear
são Merge Sort e Quick Sort.
Veja um exemplo de Merge Sort.
@dev.conde
Notação BIG O #programacao
Log Linear O(n log n)
@dev.conde
Notação BIG O #programacao
Quadrática O(n²)
Ocorre quando o tempo de execução
cresce proporcionalmente ao
quadrado do tamanho da entrada n.
Em uma função quadrática, é comum
possuir loops aninhados.
Um exemplo clássico é o Bubble Sort
@dev.conde
Notação BIG O #programacao
Quadrática O(n²)
O código Bubble Sort percorre o array
n vezes e para cada iteração i, ele faz
comparações e trocas.
@dev.conde
Notação BIG O #programacao
Exponencial O(2^n)
A complexidade exponencial O(2^n)
ocorre quando o tempo de execução
de um algoritmo dobra a cada
aumento unitário no tamanho da
entrada n.
Esses algoritmos geralmente exploram
todas as combinações possíveis de
escolhas e são altamente ineficientes
para grandes valores de n.
@dev.conde
Notação BIG O #programacao
Exponencial O(2^n)
Exemplo interessante é o da mochila do
ladrão
Imagina que o ladrão vai assaltar uma casa e
ele tem uma mochila para levar os itens, mas
essa mochila tem um peso máximo que ela
suporta.
Na casa há diversos itens que o ladrão pode
levar, cada um com o seu peso e valor. Um
item por exemplo, pesa 1kg e vale 2 mil reais, já
outro pesa o mesmo 1kg e vale 600 reais.
A ideia é realizar todas as combinações
possível para que ele consiga levar os itens
sem ultrapassar o limite da bolsa e com o
maior lucro possível.
@dev.conde
Notação BIG O #programacao
Exponencial O(2^n)
A abordagem recursiva para calcular o n-ésimo
número da sequência de Fibonacci é um
exemplo clássico de complexidade O(2^n).
@dev.conde
#programacao
Ficou mais fácil de
entender a notação
BIG O?
Conte nos comentários
@dev.conde