
Notação Big O
A notação Big O é uma ferramenta matemática essencial para analisar o comportamento de algoritmos à medida que o tamanho da entrada cresce.
A notação Big O é uma ferramenta matemática essencial para analisar o comportamento de algoritmos à medida que o tamanho da entrada cresce, seja tendendo a um valor específico ou ao infinito.
Em outras palavras, a notação Big O expressa a complexidade de um algoritmo em termos de funções matemáticas. Ela fornece uma maneira de descrever a eficiência de um algoritmo em relação ao tamanho da entrada.
Níveis de Complexidade
Constante — O(1)
Algoritmos com complexidade constante são caracterizados por um número fixo de operações independentemente do tamanho da entrada N.
Isso significa que o tempo de execução não aumenta à medida que o tamanho da entrada cresce.
Linear — O(n)
Algoritmos com complexidade linear executam uma quantidade de operações que é diretamente proporcional ao tamanho dos dados de entrada. Isso significa que, à medida que o tamanho da entrada aumenta, o tempo de execução do algoritmo também aumenta na mesma proporção.
Logarítmica — O(log n)
Algoritmos com complexidade logarítmica são comuns em problemas que utilizam a estratégia de divisão e conquista, onde um problema grande é dividido em problemas menores e mais gerenciáveis. Um exemplo clássico desse tipo de algoritmo é a busca binária.
Algoritmos com complexidade logarítmica são eficientes para problemas onde a entrada pode ser dividida em subproblemas menores, e o número de operações necessárias cresce de forma muito mais lenta em comparação com a complexidade linear.
Linearítmica — O(n log n)
Algoritmos com complexidade linearítmica são comuns em problemas que combinam características de complexidade linear e logarítmica. Um exemplo clássico é o algoritmo de ordenação QuickSort.
No QuickSort, a lista de elementos é dividida em subgrupos e cada subgrupo é ordenado separadamente. Em seguida, as soluções parciais são combinadas para obter a solução final. O tempo de execução do QuickSort é O(n log n) pois o algoritmo divide a lista de elementos N vezes (complexidade linear) e, em cada divisão, o tamanho dos subgrupos é reduzido pela metade (complexidade logarítmica).
Quadrático — O(n²)
Algoritmos com complexidade quadrática são caracterizados pelo aumento do tempo de execução de forma quadrática com o tamanho da entrada N. Isso significa que o tempo necessário para a execução do algoritmo aumenta quadráticamente à medida que o tamanho dos dados de entrada aumenta.
Um exemplo comum de algoritmo com complexidade quadrática é o algoritmo de ordenação BubbleSort.
Exponencial — O(2ⁿ)
Algoritmos com complexidade exponencial são caracterizados pelo aumento exponencial do tempo de execução com o tamanho da entrada N. Isso significa que o tempo necessário para a execução do algoritmo cresce de forma exponencial à medida que o tamanho dos dados de entrada aumenta.
Fatorial — O(n!)
Esses algoritmos são extremamente ineficientes para conjuntos de dados moderadamente grandes, devido ao rápido crescimento do número de operações necessárias. Um exemplo comum de problema que resulta em complexidade fatorial é gerar todas as permutações de uma lista.