15 de maio de 2022 • 2 min de leitura
Notação de Big-O
O que é a notação de Big-O?
Atualmente estou estudando sobre Notação de Big-O… E me sinto frustada em saber que muitas faculdades* abordam este assunto de forma muito superficial.
*Baseado em conversas que tive com amigos, e também com a minha própria experiência na graduação, o máximo que vi foi sobre as estruturas: pilhas, filas etc.
Daria até para levantar um assunto apenas sobre a qualidade de ensino das faculdades da área de tecnologia aqui no Brasil.
Mas enfim… seguindo com o assunto sobre Big-O…
“Como podemos medir a eficiência de um algoritmo?”
Ref.: Livro da Loiane Groner - Estruturas de dados e algoritmos com Javascript
A Notação de Big-O é usada para descrever o desempenho, eficiência, ou a complexidade de um algoritmo, utilizando o tempo de execução e o espaço/memória consumida como métrica.
Nesta tabela é possível ver a complexidade da notação big-O: Big-O Cheat Sheet
Vejamos alguns exemplos:
- O(1) Constant / Constante
Independente do valor de entrada de x o consumo se manterá o mesmo, ou seja, se mantém constante, sem variações
Se x for 10 ou 100 não faz diferença
function O1(x) {
return ++x;
}
O1(1);
Entrada: 1 - Saída: 2
- O(n) Linear
O consumo vai aumentando conforme o N aumenta
Se N for 10 irá executar 10x
Se N for 100 irá executar 100x
function ON(arr) {
let count = 0;
for (let i = 0; i < arr.length; i++) {
count += 1;
}
return count;
}
ON([1, 2, 3, 4, 5]);
Entrada: [1, 2, 3, 4, 5] - Saída: 5
- O(n^2) Quadratic / Quadrática
Aqui o negócio começa a ficar cabuloso
Se a entrada for um array com 10 itens (N), ele irá passar pelo primeiro loop 10x e pelo loop interno mais 10x
No final isto irá executar 100x!
10^2 = 100
Sim, agora imagine um array contendo 1000 itens? 😜
function ON2(arr) {
let count = 0;
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
count += 1;
}
}
return count;
}
ON2([1, 2, 3, 4, 5]);
Entrada: [1, 2, 3, 4, 5] - Saída: 25
E vai indo…
- O(log(n)) Logarithmic / Logarítmica
- O((log(n))c) Polylogarithmic / Polilogarítmica
- O(n^c) Polynomial / Polinomial
- O(c^n) Exponential / Exponencial
Ainda sigo estudando sobre a Notação Big-O, para isto estou utilizando estes livros:
- Estruturas de dados e algoritmos com Javascript - Loiane Groner
- Algoritmos - Teoria e Prática por Thomas Cormen
- Cracking the Coding Interview por Gayle Laakmann McDowell
E aí o que achou? Você já tinha ouvido falar sobre a Notação Big-O? 🙂