O endereçamento aberto em Hash tables é uma técnica de Tratamento de colisões em hash tables que parte da pressuposição de que o número de chaves a ser armazenado na tabela é menor ou igual ao tamanho da tabela, ou seja, . Partindo desse princípio, assume-se que é possível armazenar todas as chaves na tabela, sem a necessidade de outra estrutura para tratar colisões.
Tendo isso em vista, nesse método a colisão é tratada com a busca de uma nova posição para a inserção na própria tabela. Isso exige uma modificação da função hash para receber, além da chave, um parâmetro que indica o número de “tentativas” já feitas até o momento da chamada da função. Dessa forma há a garantia que, em caso de colisão, uma nova posição será buscada.
Existem três técnicas comumente utilizadas para buscar a nova posição no caso de uma colisão em tabelas que usam endereçamento aberto. Elas diferem principalmente na forma como as chaves são espalhadas na tabela, impactando no desempenho das operações.
-
Teste linear
Dada uma função hash auxiliar que recebe como parâmetro uma chave , o método de teste linear usa a função . Dessa forma, a busca pela chave (ou por um espaço vazio para sua inserção) ocorre de forma linear na tabela.
Apesar de sua fácil implementação, esse tipo de abordagem introduz o problema de agrupamento primário, que consiste na construção de longas sequências de posições ocupadas na tabela, degradando o desempenho da busca.
-
Teste quadrático
Dada uma função hash auxiliar que recebe como parâmetro uma chave , o método de teste quadrático usa a função , onde e são constantes auxiliares. Esse método elimina o agrupamento primário, já que a posição da tabela resultante da função hash tem uma relação quadrática com o parâmetro .
Apesar de prevenir o agrupamento primário, essa técnica introduz um outro problema: o agrupamento secundário. Esse tipo de agrupamento consiste no fato de que se a posição inicial de duas chaves com for igual, ela será igual para qualquer .
-
Duplo mapeamento
Dadas duas funções hash auxiliares e , o método de mapeamento duplo usa a função . Dessa forma, a sequência de posições buscadas depende duplamente da chave , resultando em um maior número de sequências possíveis.
Note que é necessário que e o tamanho da tabela hash sejam relativamente primos para garantir que todas as posições da tabela sejam buscadas. Isso pode ser garantido de duas formas:
- Tomando como uma potência de e escolhendo de forma que sempre seja um número ímpar.
- Tomando como um número primo e escolhendo de forma que .
O duplo mapeamento produz o melhor desempenho médio entre as técnicas de endereçamento aberto. Entretanto, sua implementação é significativamente mais complexa quando comparada a outros métodos.