Pular para o conteúdo

Estruturas de Dados e Algoritmos

DSA não é só “assunto de entrevista”.

DSA é o que faz você parar de resolver problema no improviso.

Quando você entende estrutura de dados e algoritmos, começa a enxergar melhor:

  • como organizar informação
  • como reduzir custo de processamento
  • como evitar solução torta
  • como explicar por que um código é melhor que outro

Então vamos direto ao ponto.

É a forma como você organiza a informação.

Pergunta que ela responde:

como eu armazeno isso do jeito certo?

Exemplos:

  • lista para sequência
  • mapa para chave e valor
  • fila para ordem de atendimento
  • heap para prioridade
  • grafo para conexões

É o passo a passo para transformar dados e resolver um problema.

Pergunta que ele responde:

como eu chego do estado atual ao resultado certo?

Exemplos:

  • buscar
  • ordenar
  • contar
  • percorrer
  • encontrar caminho mínimo

É o custo da solução.

Perguntas que ela responde:

  • quanto o tempo cresce?
  • quanto de memória isso consome?
  • essa solução escala ou morre cedo?

Muita gente acha que DSA só serve para LeetCode.

Não viaja nessa.

DSA aparece em código real o tempo todo:

  • feed ordenado
  • cache
  • fila de jobs
  • autocomplete
  • ranking
  • deduplicação
  • busca
  • roteamento
  • paginação
  • rate limit

Quando você escolhe a estrutura errada, o sistema até funciona.

Mas funciona gastando mais memória, mais CPU e mais dor de cabeça.

Se a sua dúvida for “qual caminho eu sigo?”, pensa assim:

SituaçãoEstrutura ou ideia que costuma aparecer
Preciso manter ordemLista / array
Preciso buscar rápido por chaveMap / hash table
Preciso evitar duplicidadeSet
Preciso obedecer ordem de chegadaQueue
Preciso desfazer ou voltar passosStack
Preciso pegar maior/menor com frequênciaHeap
Preciso representar relaçõesGraph
Preciso consultas por intervaloFenwick / Segment Tree

Não decora isso como tabela mágica.

Usa como mapa inicial.

Estruturas que você realmente precisa dominar primeiro

Seção intitulada “Estruturas que você realmente precisa dominar primeiro”

É a estrutura mais comum do dia a dia.

Use quando:

  • a ordem importa
  • você percorre muito
  • o acesso por índice ajuda

Cuidado:

  • inserir no meio toda hora custa caro
  • buscar item por valor pode custar O(n)

É uma das estruturas com melhor custo-benefício do mundo real.

Use quando:

  • você precisa buscar por chave
  • quer contar frequências
  • quer indexar dados rapidamente

Exemplo clássico:

  • email -> usuário
  • id -> pedido
  • palavra -> quantidade

Perfeito para existência e unicidade.

Use quando:

  • você precisa saber se algo já apareceu
  • duplicata é problema

Exemplo:

  • validar itens repetidos
  • filtrar usuários já processados

Pilha é LIFO: o último que entra é o primeiro que sai.

Use quando:

  • precisa desfazer ação
  • precisa controlar contexto aninhado
  • trabalha com parsing ou DFS

Fila é FIFO: o primeiro que entra é o primeiro que sai.

Use quando:

  • precisa processar ordem de chegada
  • trabalha com jobs, eventos e BFS

Heap resolve muito problema de prioridade.

Use quando:

  • você quer os top K
  • precisa sempre do menor ou maior elemento
  • está lidando com escalonamento ou ranking

Grafo aparece quando existem relações entre entidades.

Use quando o problema envolve:

  • caminhos
  • dependências
  • conexões
  • recomendação
  • redes

Boa o suficiente quando:

  • o volume é pequeno
  • o custo de simplicidade vale mais

Entra quando os dados estão ordenados e você quer reduzir o custo de busca.

Ideia:

  • corta o espaço de busca pela metade a cada passo

Você não precisa decorar 15 algoritmos de sorting.

Mas precisa entender:

  • por que ordenar custa
  • quando a linguagem já resolve
  • quando estabilidade importa

Na prática:

  • sort da linguagem geralmente basta
  • o importante é saber o impacto de ordenar com frequência

Esses dois mudam o jogo quando você começa a trabalhar com árvore e grafo.

Use BFS quando:

  • quer explorar por níveis
  • quer caminho mínimo em grafo não ponderado

Use DFS quando:

  • quer explorar profundidade
  • detectar ciclos
  • percorrer dependências

É o algoritmo clássico para menor caminho com pesos positivos.

Aparece em:

  • mapas
  • rotas
  • custo mínimo
  • caminhos com prioridade

Padrão simples, mas poderoso.

Aparece em:

  • remoção de duplicados
  • comparação nas pontas
  • janelas e pares

Excelente para string, array e subarray.

Use quando:

  • existe uma “janela” que expande e contrai
  • você quer maior, menor, soma ou frequência em trecho contínuo

Aqui muita gente trava porque tenta decorar fórmula.

Errado.

DP começa quando o problema tem:

  • subproblemas repetidos
  • dependência entre estados

A pergunta certa é:

o que muda de um estado para o outro?

Big-O importa, mas não precisa virar religião.

Pensa assim:

  • O(1): custo constante
  • O(log n): cresce devagar
  • O(n): cresce junto com a entrada
  • O(n log n): muito comum em algoritmos bons de ordenação
  • O(n²): começa a doer rápido

Regra prática:

  • primeiro faz funcionar
  • depois mede
  • depois otimiza o que realmente dói

Mas se você já percebe um O(n²) desnecessário em dado grande, corta cedo. Não espera virar incêndio.

Se você quer retorno alto de estudo, foca nesses padrões:

  1. frequência com map
  2. two pointers
  3. sliding window
  4. stack
  5. queue / BFS
  6. árvore com DFS
  7. heap / top K
  8. programação dinâmica básica

Esse núcleo já cobre muito problema clássico.

Aprenda estrutura e uso.

Perguntas:

  • o que essa estrutura faz?
  • qual operação é forte?
  • qual operação é fraca?
  • quando ela simplifica a solução?

Resolva problemas pequenos.

Exemplos:

  • detectar duplicado
  • contar frequência
  • inverter string
  • validar parênteses
  • encontrar maior soma

Explique sua solução em voz alta.

Se você não consegue explicar:

  • estrutura escolhida
  • custo
  • por que não usou outra abordagem

então ainda não consolidou.

Revise padrões, não só problemas isolados.

Quem cresce de verdade em DSA aprende a reconhecer família de problema.

  • arrays
  • strings
  • hash map
  • set

Objetivo:

  • parar de resolver tudo na força bruta
  • stack
  • queue
  • deque
  • two pointers
  • sliding window

Objetivo:

  • ganhar velocidade em problemas de sequência
  • linked list
  • árvore binária
  • BST
  • DFS
  • BFS

Objetivo:

  • aprender travessia e estrutura hierárquica
  • heap
  • priority queue
  • top K
  • merge com prioridade

Objetivo:

  • entender ranking, fila inteligente e seleção eficiente
  • grafos
  • Dijkstra
  • Union-Find

Objetivo:

  • aprender conectividade, caminho e agrupamento
  • recursão
  • backtracking
  • programação dinâmica básica
  • revisão

Objetivo:

  • fechar o repertório inicial com mais profundidade
  • decorar resposta sem entender padrão
  • pular para problema difícil cedo demais
  • ignorar análise de custo
  • usar estrutura sofisticada para problema simples
  • nunca revisar os erros

Mesmo fora de entrevista, DSA te deixa melhor em:

  • modelagem de dados
  • clareza de solução
  • performance
  • debugging
  • argumentação técnica

Você para de falar “acho que funciona” e começa a falar:

  • “essa estrutura simplifica acesso por chave”
  • “essa abordagem corta uma iteração inteira”
  • “aqui o gargalo cresce com a entrada”

Isso muda o nível da conversa.