Blog.

Entendendo a Complexidade de Algoritmos com Notação Big-O

Enzo Spagnolli Direito
Enzo Spagnolli Direito

A complexidade de algoritmos é um dos fundamentos essenciais para qualquer desenvolvedor que deseja escrever código eficiente. A notação Big-O ajuda a entender o comportamento do tempo de execução de um algoritmo à medida que a entrada cresce.

O que é a Notação Big-O?

Big-O é uma forma de descrever a taxa de crescimento do tempo de execução ou uso de memória de um algoritmo. Ela nos ajuda a classificar algoritmos de acordo com sua eficiência no pior caso.

Em termos simples, Big-O expressa a relação entre o número de operações que um algoritmo executa e o tamanho da entrada. Algumas das complexidades mais comuns incluem:

  • O(1) - Tempo constante

  • O(log n) - Tempo logarítmico

  • O(n) - Tempo linear

  • O(n log n) - Tempo quase linear

  • O(n^2) - Tempo quadrático

  • O(2^n) - Tempo exponencial

  • O(n!) - Tempo fatorial

Exemplos Práticos

O(1) - Tempo Constante

function acessarPrimeiroElemento(array: number[]): number {
  return array[0];
}

Não importa o tamanho do array, a função sempre acessa um único elemento, mantendo um tempo de execução constante.

O(n) - Tempo Linear

function somarElementos(array: number[]): number {
  let soma = 0;
  for (const num of array) {
    soma += num;
  }
  return soma;
}

Aqui, o número de operações cresce proporcionalmente ao tamanho da entrada.

O(n^2) - Tempo Quadrático

function paresPossiveis(array: number[]): void {
  for (let i = 0; i < array.length; i++) {
    for (let j = 0; j < array.length; j++) {
      console.log(array[i], array[j]);
    }
  }
}

Com dois loops aninhados, a quantidade de operações cresce exponencialmente conforme o tamanho da entrada aumenta.

Como Otimizar Algoritmos?

Evite loops aninhados desnecessários

Prefira estruturas de dados eficientes (ex: Set em vez de Array para buscas)

Utilize técnicas como memoização e programação dinâmica

Entender Big-O é essencial para tomar decisões informadas ao projetar sistemas escaláveis. Sempre que possível, revise e otimize seus algoritmos para garantir que sua aplicação funcione de forma eficiente, mesmo em cenários de alto volume de dados.