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.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Por que a busca é quase instantânea.
Os objetivos desta aula. 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.
Veja o essencial, parte por parte.
De onde vem o tempo constante. Buscar pela chave numa tabela hash é O(1) em média: quase não depende do tamanho.
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.
Crescer e reorganizar para manter a velocidade. Boa função hash: espalha as chaves e evita amontoados que viram varredura.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.
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")
fimO 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.