Desenvolvimento Web

Big O Notation: complexidade de algoritmos explicada para quem está na faculdade

Big O Notation: complexidade de algoritmos explicada para quem está na faculdade

Sua solução funciona. Passa nos testes. Mas quando os dados crescem de 100 para 100.000 registros, ela trava. Você não entende por quê — o código está certo. O problema não é correção, é performance, e para analisar performance precisamos de uma linguagem comum: a Big O Notation. É o vocabulário que todo desenvolvedor precisa para discutir eficiência de algoritmos e não ficar na mão quando os dados crescem.

O que Big O mede

Big O descreve como o tempo de execução (ou uso de memória) de um algoritmo cresce em função do tamanho dos dados de entrada (n). Não mede tempo em segundos — isso depende do hardware, da linguagem, do compilador. Mede a taxa de crescimento: O(1) cresce constante (não importa o n), O(n) cresce linearmente, O(n²) cresce quadraticamente. Compara algoritmos de forma independente de hardware — um O(n) é sempre mais escalável que O(n²) para n suficientemente grande.

A notação ignora constantes e termos menores: O(2n) e O(n + 100) são ambos O(n). Isso pode parecer impreciso, mas na prática para grandes n, a constante importa muito menos que a ordem de crescimento. O que importa é: dobrar n, quanto o algoritmo demora mais? Linear (2x)? Quadrático (4x)? Logarítmico (apenas um pouco mais)?

O(1) — Tempo constante

A operação leva o mesmo tempo independente do n. Acessar um elemento de um array pelo índice (arr[500]) é O(1) — não importa se o array tem 10 ou 10 milhões de elementos, é uma operação de memória direta. Inserção/deleção no início ou fim de certas estruturas de dados também é O(1). Has tables (dicionários, objetos JavaScript, HashMaps Java) têm acesso por chave O(1) em média — muito mais rápido que buscar em um array não ordenado.

O(log n) — Tempo logarítmico

A log base 2 de 1 milhão é apenas 20. Isso significa que um algoritmo O(log n) resolve 1 milhão de elementos em 20 “passos”. O exemplo mais claro é a busca binária: em um array ordenado, você compara o elemento do meio, descarta metade do array, e repete. Cada passo elimina metade da busca. Para 1 bilhão de elementos, a busca binária precisa de no máximo 30 comparações. Algoritmos O(log n) são praticamente constantes na prática para qualquer tamanho de dado razoável.

O(n) — Tempo linear

O tempo cresce proporcionalmente ao n. Percorrer um array do início ao fim para encontrar o maior elemento é O(n) — você precisa olhar cada elemento uma vez. Duplicar n dobra o tempo. Linear é geralmente considerado eficiente para operações que precisam processar cada elemento. A maioria dos algoritmos de streaming de dados e processamento de logs é O(n) — você lê cada registro uma vez e o descarta.

O(n log n) — Quase linear

É a complexidade dos melhores algoritmos de ordenação genéricos (Merge Sort, Quick Sort em média, Heap Sort, Timsort). É levemente pior que linear mas muito melhor que quadrático. Para 1 milhão de elementos: O(n) faz 1M operações, O(n log n) faz ~20M, O(n²) faz 1 trilhão. Na prática, O(n log n) é considerado ótimo para algoritmos de ordenação — e foi provado matematicamente que nenhum algoritmo baseado em comparações pode superar O(n log n).

O(n²) — Tempo quadrático e pior

Dois loops aninhados que percorrem o mesmo array geralmente geram O(n²). Para 1000 elementos, são 1 milhão de operações. Para 10.000, são 100 milhões. Para 100.000, são 10 bilhões — começa a ficar impraticável. Bubble Sort, Insertion Sort e Selection Sort são O(n²). Algoritmos O(n³) (três loops aninhados) são raros em uso prático por serem proibitivos. Multiplicação de matrizes ingênua é O(n³).

O(2^n) e O(n!) crescem de forma explosiva — impraticáveis para n acima de 20-30. Aparecem em problemas combinatoriais como o problema do caixeiro viajante (brute force). Para esses problemas, algoritmos de aproximação ou heurísticas são a solução prática. Internalizar Big O muda como você escreve código: antes de escolher uma estrutura de dados, você pergunta “que operações vou fazer mais e qual é a complexidade delas?”. Um HashMap em vez de uma busca linear pode ser a diferença entre uma aplicação que serve 100 usuários e uma que serve 1 milhão.

Tem um projeto em mente?

Somos especialistas em transformar ideias em produtos digitais. Apps, sites, automações e IA — vamos construir juntos.

Resposta rápida Orçamento sem compromisso +100 projetos entregues
Compartilhar: