Menu
Coddy logo textTech

Hash Map

Última atualização

Um hash map armazena pares chave-valor e permite buscar um valor pela sua chave em O(1) em média. Ele funciona exatamente como uma tabela hash, mas cada entrada de balde carrega tanto uma chave quanto seu valor associado. Para armazenar ou recuperar um par, a chave é hasheada em um índice de balde e, em seguida, a cadeia daquele balde é percorrida em busca da chave correspondente. Pressione reproduzir acima para ver os pares serem colocados por balde hasheado e um valor ser recuperado pela sua chave.

Esta é a estrutura por trás do dict do Python, do HashMap do Java e do Map/objetos do JavaScript. As colisões são tratadas do mesmo jeito que em uma tabela hash - aqui, por encadeamento separado - então o desempenho depende de uma boa função de hash e de um fator de carga baixo.

Complexidade de tempo

OperaçãoMédiaPior caso
Inserir/atualizar (put)O(1)O(n)
Buscar (get)O(1)O(n)
RemoverO(1)O(n)
EspaçoO(n)O(n)

Hash map em linguagens comuns

LinguagemTipo
Pythondict
JavaHashMap
JavaScriptMap / objeto
C++std::unordered_map
Gomap

Exemplo resolvido

Inserindo os pares ("cat", 3), ("dog", 5), ("cat", 9), ("emu", 7) em um mapa com 8 baldes, usando hash(key) % 8. Suponha hash("cat") % 8 = 2, hash("dog") % 8 = 5, hash("emu") % 8 = 2:

PassoEstruturaAção
Put ("cat", 3)balde 2: [("cat", 3)]Hasheia para o balde 2; cadeia vazia, então adiciona o par.
Put ("dog", 5)balde 2: [("cat", 3)], balde 5: [("dog", 5)]Hasheia para o balde 5; cadeia vazia, então adiciona o par.
Put ("cat", 9)balde 2: [("cat", 9)], balde 5: [("dog", 5)]Hasheia para o balde 2; a chave "cat" já está na cadeia, então atualiza seu valor para 9.
Put ("emu", 7)balde 2: [("cat", 9), ("emu", 7)], balde 5: [("dog", 5)]Hasheia para o balde 2; colide com "cat", a chave não é encontrada, então adiciona o par.
Get "emu"balde 2: [("cat", 9), ("emu", 7)]Hasheia para o balde 2; percorre a cadeia, pula "cat", casa com "emu", retorna 7.

Quando usar um hash map

Use quandoEvite quando
Você precisa de busca, inserção e remoção em O(1) médio por uma chave exata.Você precisa manter as chaves ordenadas ou fazer consultas por intervalo - use uma BST balanceada ou um mapa ordenado.
As chaves são hasheáveis e a igualdade é bem definida (strings, inteiros, tuplas).As chaves são mutáveis e podem mudar após a inserção, o que corrompe seu balde.
Você está contando, deduplicando, fazendo cache ou indexando por um identificador.Você precisa de garantias de pior caso O(log n) em vez de limites médios amortizados.
A ordem de iteração não importa, ou um mapa ordenado por inserção é suficiente.A memória é muito limitada - baldes, folga do fator de carga e ponteiros acrescentam sobrecarga.

Código de Hash Map

Uma implementação limpa e executável de Hash Map em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Hash Map em Python

Python
1# Python's built-in dict is a hash map: O(1) average2# insert, lookup, and delete.3inventory = {"apple": 3, "banana": 7}4
5# Insert and update6inventory["cherry"] = 57inventory["apple"] += 28
9# Lookup, with .get for a safe default on missing keys10print("apple: ", inventory["apple"])11print("mango: ", inventory.get("mango", 0))12
13# Membership test and delete14print("banana in stock:", "banana" in inventory)15del inventory["banana"]16print("banana in stock:", "banana" in inventory)17
18# Iterate over key-value pairs19for fruit, count in sorted(inventory.items()):20    print(f"{fruit}: {count}")21
22# Classic hash map use case: counting frequencies23words = "the quick brown fox jumps over the lazy dog the end".split()24freq = {}25for word in words:26    freq[word] = freq.get(word, 0) + 127
28print("Occurrences of the:", freq["the"])29print("Most common word:  ", max(freq, key=freq.get))
Execute este código no Playground de Python

Perguntas frequentes sobre hash map

Qual é a diferença entre um hash map e uma tabela hash?
São essencialmente a mesma estrutura - um arranjo de baldes endereçados por um hash da chave. No uso comum, "tabela hash" muitas vezes se refere a um conjunto de chaves ou à técnica geral, enquanto "hash map" enfatiza o armazenamento de pares chave-valor. Algumas linguagens também fazem uma distinção de segurança entre threads (por exemplo, Hashtable vs HashMap no Java), mas o algoritmo central é idêntico.
Qual é a complexidade de tempo de um hash map?
Put, get e delete são O(1) em média com uma boa função de hash e um fator de carga baixo. No caso patológico em que todas as chaves colidem em um único balde, elas degeneram para O(n), por isso o redimensionamento e um bom hashing importam.
Como um hash map lida com duas chaves que hasheiam para o mesmo balde?
Ele resolve a colisão. Esta visualização usa encadeamento separado: cada balde contém uma pequena lista, e um novo par cuja chave hasheia ali é adicionado a essa lista. Na busca, o mapa percorre a cadeia curta procurando a chave correspondente. A técnica alternativa é o endereçamento aberto, que sonda outro slot no arranjo.
Hash map vs árvore binária de busca: qual devo usar?
Use um hash map quando você só precisa de busca por chave exata e quer operações em O(1) médio. Use uma árvore binária de busca balanceada (como TreeMap ou std::map) quando precisar de chaves ordenadas, consultas por intervalo ou buscas de predecessor/sucessor, que custam O(log n). A BST troca um pouco de velocidade por garantias de ordenação que um hash map não consegue oferecer.
O que é o fator de carga e por que ele dispara o redimensionamento?
O fator de carga é a razão entre as entradas armazenadas e os baldes. À medida que ele sobe, as cadeias ficam mais longas e as buscas médias ficam mais lentas, então a maioria das implementações redimensiona (tipicamente dobra os baldes e re-hasheia tudo) ao ultrapassar um limiar como 0.75. O redimensionamento é O(n) mas raro, então é amortizado e mantém as operações médias em O(1).
Posso usar um objeto mutável como uma lista como chave de um hash map?
Normalmente não. As chaves precisam ser hasheáveis e seu hash deve permanecer constante enquanto estão no mapa - o Python lança TypeError: unhashable type para uma list, por exemplo. Se você mutar uma chave após inseri-la, seu hash muda e o mapa não consegue mais encontrá-la no balde certo, perdendo a entrada silenciosamente. Use chaves imutáveis como strings, números ou tuplas.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR