Módulo 11 - Tabelas hash: o dicionário por dentro

Por que a busca é quase instantânea

8 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

O que você vai aprender

  • Entender por que a busca por chave é O(1) em média.
  • Diferenciar o custo médio (rápido) do pior caso (lento).
  • Definir fator de carga como a razão entre itens e tamanho do vetor.
  • Explicar por que a tabela cresce e se reorganiza quando enche.

De onde vem o tempo constante

Compare os custos. Achar um valor numa lista comum pela busca item por item é O(n): no pior caso, você olha os n itens. Numa lista ordenada, a busca binária corta pela metade a cada passo e chega a O(log n), bem melhor, mas ainda cresce com o tamanho. A tabela hash faz algo diferente: calcula o índice da chave e vai direto ao balde. Esse cálculo não olha os outros itens, então não importa se a tabela tem dez ou dez milhões de pares, o número de passos para chegar ao balde é praticamente o mesmo. Esse custo que quase não cresce com o tamanho é o tempo constante, escrito O(1). É a razão de o dicionário ser a estrutura preferida quando o que você faz o tempo todo é buscar pela chave.

Vale insistir numa palavra: em média. O O(1) da tabela hash é uma média, não uma garantia para cada operação. Se a função espalha bem e a tabela não está lotada, cada balde tem pouquíssimos itens, e ir ao balde mais conferir um ou dois pares é rápido, praticamente constante. Mas se muitos itens colidem no mesmo balde, achar a chave certa ali dentro vira uma pequena varredura, e no pior caso, com tudo num balde só, a tabela hash se comporta como uma lista, de volta ao O(n). O bom projeto trabalha para que o pior caso quase nunca aconteça, mantendo a média perto do O(1). E a alavanca principal para isso é o fator de carga.

Gráfico comparando o número de passos de busca conforme a coleção cresce. Três curvas partem da esquerda: uma reta que sobe forte, rotulada lista O(n); uma que sobe devagar, rotulada busca binária O(log n); e uma quase horizontal, colada na base, rotulada tabela hash O(1). Um bilhete aponta para o fim da curva da tabela mostrando uma leve subida quando o vetor lota.
Enquanto a lista cresce em passos e a busca binária sobe devagar, a tabela hash fica quase plana em O(1), até o vetor lotar.

O fator de carga: quão cheia está a tabela

O fator de carga é uma conta simples: a quantidade de itens guardados dividida pelo número de posições do vetor. Um vetor de dez posições com três itens tem fator de carga 0,3; com nove itens, 0,9. Esse número resume a lotação da tabela e prevê o desempenho. Fator baixo significa muita folga, poucos itens por balde e busca rápida. Fator alto significa vetor apertado, muitas colisões e busca cada vez mais lenta. Por isso o fator de carga é o termômetro da tabela hash: enquanto ele fica baixo, o O(1) se sustenta; quando sobe demais, a estrutura começa a perder o que a tornava especial. As implementações reais vigiam esse número de perto.

// fator de carga = itens guardados / posições do vetor
itens <- 6
posicoes <- 10
carga <- itens / posicoes
escreva("Fator de carga: ", carga)   // 0.6

// muitas implementações crescem quando a carga passa de ~0.7
SE carga > 0.7 ENTÃO
  escreva("Hora de crescer o vetor e reposicionar as chaves")
fim

O fator de carga mede a lotação. Passando de um limite (por volta de 0,7), a tabela costuma crescer o vetor.

🎮 Jogo da aula

Verdadeiro ou falso: custo e carga

Decida se cada afirmação sobre o custo da tabela hash e o fator de carga é verdadeira ou falsa.

Crescer e reorganizar para manter a velocidade

O que uma tabela hash faz quando o fator de carga sobe demais? Ela cresce. Ao passar de um limite (nas implementações reais, algo por volta de 0,7), a estrutura cria um vetor maior, geralmente com o dobro de posições, e recoloca cada item, recalculando o índice de cada chave no vetor novo. Esse processo tem nome, reidratação ou redimensionamento, e é a manutenção que mantém a busca rápida ao longo do tempo. Recolocar tudo tem um custo pontual, aquela operação específica é cara, mas acontece raramente e, diluído entre as muitas inserções baratas, o custo médio por operação continua constante. É por isso que, mesmo com a tabela crescendo, você quase nunca sente lentidão: o preço da mudança de casa é pago aos poucos.

Teste rápido

Por que a busca por chave numa tabela hash é considerada O(1) em média?

Perguntas frequentes

O que significa O(1) na prática?
Significa que a operação leva mais ou menos o mesmo número de passos independentemente do tamanho da coleção. Buscar numa tabela com mil ou com um milhão de itens custa praticamente o mesmo. Não quer dizer um passo exato, e sim um custo que quase não cresce com o tamanho, ao contrário do O(n) da lista, que cresce em linha reta.
Se é tão rápida, por que nem sempre usamos tabela hash?
Porque ela é ótima para buscar pela chave, mas não guarda ordem e gasta memória extra com a folga do vetor. Se você precisa dos dados ordenados, ou percorrer tudo em sequência, ou o menor uso possível de memória, outras estruturas servem melhor. A tabela hash brilha no cenário específico de guardar e achar valores por uma chave.
Qual é o pior caso da tabela hash?
É quando muitos itens caem no mesmo balde, no extremo todos num só. Aí achar uma chave vira uma varredura daquele balde, e o custo chega a O(n), igual ao de uma lista. Isso acontece com função hash ruim ou tabela muito lotada. Boa função e fator de carga controlado tornam esse pior caso raro na prática.
Qual fator de carga é considerado bom?
Varia com a estratégia de colisão, mas valores baixos, com folga no vetor, mantêm a busca rápida. Muitas implementações começam a crescer o vetor quando a carga passa de algo em torno de 0,7, justamente para não deixar a tabela apertada. O número exato é uma decisão de projeto que equilibra velocidade e uso de memória.
O redimensionamento não deixa a tabela lenta?
A operação que dispara o crescimento é cara, porque recoloca todos os itens. Mas ela acontece de vez em quando, não a cada inserção. Espalhando esse custo pelas muitas inserções baratas que vêm antes e depois, o custo médio por operação continua constante. Por isso, no uso normal, você raramente percebe o momento em que a tabela cresceu.
Por que o dicionário é a estrutura preferida para tantas coisas?
Porque buscar, guardar e atualizar pela chave em tempo médio constante cobre uma enorme quantidade de problemas do dia a dia: contar ocorrências, associar identificadores a dados, guardar configurações, montar caches. Sempre que a pergunta é dado uma chave, qual é o valor, a tabela hash responde depressa, e é isso que a torna onipresente na programação.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.