Significado de hash aberto e hash fechado

94

Hashing aberto (encadeamento separado):

No hashing aberto, as chaves são armazenadas em listas vinculadas anexadas às células de uma tabela hash.

Hashing fechado (endereçamento aberto):

No hashing fechado, todas as chaves são armazenadas na própria tabela de hash sem o uso de listas vinculadas.

Não consigo entender por que eles são chamados de abertos, fechados e separados. Alguém pode explicar isso?

hareendra reddy
fonte
Na verdade, nunca armazenamos chaves em tabelas hash, pegamos uma tupla (chave, valor) e usamos a chave para calcular onde o valor deve ser armazenado. Então, na verdade, armazenamos os valores na tabela de hash
Sr. Suryaa Jha

Respostas:

117

O uso de "fechado" vs. "aberto" reflete se estamos ou não restritos ao uso de uma determinada posição ou estrutura de dados (esta é uma descrição extremamente vaga, mas espero que o resto ajude).

Por exemplo, o "aberto" em "endereçamento aberto" nos diz que o índice (também conhecido como endereço) no qual um objeto será armazenado na tabela hash não é completamente determinado por seu código hash. Em vez disso, o índice pode variar dependendo do que já está na tabela hash.

O "fechado" em "hash fechado" refere-se ao fato de que nunca saímos da tabela de hash; cada objeto é armazenado diretamente em um índice na matriz interna da tabela hash. Observe que isso só é possível usando algum tipo de estratégia de endereçamento aberta. Isso explica por que "hashing fechado" e "endereçamento aberto" são sinônimos.

Compare isso com hashing aberto - nesta estratégia, nenhum dos objetos é realmente armazenado na matriz da tabela de hash; em vez disso, depois que um objeto é hash, ele é armazenado em uma lista separada do array interno da tabela hash. "aberto" refere-se à liberdade que obtemos ao sair da tabela hash e usar uma lista separada. A propósito, "lista separada" sugere porque o hashing aberto também é conhecido como "encadeamento separado".

Resumindo, "fechado" sempre se refere a algum tipo de garantia estrita, como quando garantimos que os objetos são sempre armazenados diretamente na tabela hash (hash fechado). Então, o oposto de "fechado" é "aberto", então se você não tem essas garantias, a estratégia é considerada "aberta".

Ken Wayne VanderLinde
fonte
17
Devemos acrescentar que Open Hashing (Separate Chaining) não está restrito a listas vinculadas, que não são compatíveis com o cache e denegeram em ataques de colisão para comportamento O (n / 2). Você também pode usar árvores ou matrizes classificadas para os baldes em colisão.
rurban
voto negativo devido à informação conflitante: você disse que "aberto" e "fechado são sinônimos, então, no final:" o oposto de "fechado" é "aberto"
Marwen Trabelsi
1
@MarwenTrabelsi Nunca disse que "fechado" e "aberto" são sinônimos.
Ken Wayne VanderLinde
'Isso explica porque' hashing fechado 'e' endereçamento aberto 'são sinônimos.'
Marwen Trabelsi
1
Alguém pode fornecer uma fonte provando que esta é a etimologia histórica correta?
Santropedro
3

Você tem uma matriz que é a "tabela de hash".

Em Open Hashing, cada célula da matriz aponta para uma lista contendo as colisões. O hashing produziu o mesmo índice para todos os itens da lista vinculada.

Em Closed Hashing, você usa apenas um array para tudo. Você armazena as colisões na mesma matriz. O truque é usar uma maneira inteligente de pular de uma colisão em outra até encontrar o que deseja. E faça isso de forma reproduzível / determinística.

Anton Andreev
fonte
2

O nome de endereçamento aberto se refere ao fato de que a localização ("endereço") do elemento não é determinada por seu valor hash. (Este método também é chamado de hashing fechado).

No encadeamento separado , cada bucket é independente e tem algum tipo de ADT (lista, árvores binárias de pesquisa, etc.) de entradas com o mesmo índice. Em uma boa tabela de hash, cada depósito tem zero ou uma entrada, porque precisamos de operações de ordem O (1) para inserir, pesquisar, etc.

Este é um exemplo de encadeamento separado usando C ++ com uma função hash simples usando o operador mod (claramente, uma função hash ruim)

D. Pérez
fonte