[Estrutura de dados Java] como evitar conflitos na tabela hash


Prefácio

1. O que é uma tabela hash?

Esta é a resposta dada no Baidu:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
em suma, por que existe tal estrutura de dados?
Porque queremos obter os elementos que desejamos pesquisar na tabela de uma vez, sem qualquer comparação. Portanto, uma tabela hash é construída e uma relação de mapeamento um a um pode ser estabelecida entre o local de armazenamento do elemento e seu código-chave por meio de uma determinada função (função hash), para que possamos descobri-la mais rapidamente quando pesquisando. O elemento que queremos encontrar.
Na demonstração de código a seguir, uma tabela de hash é usada na camada inferior, de forma que cada letra tenha uma correspondência de um para um com o número de vezes que aparece na string;

public static void main(String[] args) {
    
    
        String s="huddiolabcsjddddop";
        int[] count=new int[26];
        for(char ch:s.toCharArray()){
    
    
            int idx=ch-'a';
            count[idx]++;
        }
        System.out.println(Arrays.toString(count));
        

Em segundo lugar, o que é uma colisão de hash

1. Por que ocorrem as colisões de hash

Para as palavras-chave Ki e Kj (i! = J) dos dois elementos de dados , mas existem: Hash (Ki) == Hash (Kj) , ou seja: diferentes palavras-chave calculam o mesmo endereço hash através da função hash , este fenômeno é chamado de colisão de hash ou colisão de hash.

2. Os conflitos de hash podem ser evitados?

Em primeiro lugar, precisamos ser claros, porque a capacidade do array subjacente de nossa tabela de hash é frequentemente menor do que o número de palavras-chave para armazenar de fato, (ou seja, quando o intervalo dos elementos que geralmente armazenamos é incerto, podem ser vários elementos Os endereços de hash são os mesmos), o que faz com que as colisões de hash sejam inevitáveis, então o que podemos fazer é reduzir a taxa de colisão tanto quanto possível .

Três, como resolver conflitos de hash

1. Detecção linear

Por exemplo, dada uma matriz, int [] array = {4,5,6,9,1,7,44}
sua operação de inserção: 1. Obtenha a posição do elemento a ser inserido na tabela de hash por meio da função de hash
2. Se Se não houver nenhum elemento nesta posição, insira-o diretamente.Se houver um elemento nesta posição, use o método de detecção linear para encontrar a próxima posição vazia para inserção.
Insira a descrição da imagem aqui

2. Método de zíper

Insira a descrição da imagem aqui
O método zipper pode ser considerado para transformar um problema de pesquisa em uma grande coleção em um problema de pesquisa em uma pequena coleção.


Resumindo

A eficiência do método de detecção linear:
Insira a descrição da imagem aqui

1. Para todos os elementos da tabela hash, qual é o número médio de comparações?
(1 + 1 + 1 + 1 + 1 + 5 + 1) /7=1,57

2. Para todos os elementos que não estão na tabela hash, qual é o número médio de comparações?
(Para cada subscrito para julgar se é contínuo)
(1 + 2 + 1 + 1 + 7 + 6 + 5 + 4 + 3 + 2) /10=3.2.

Acho que você gosta

Origin blog.csdn.net/m0_46551861/article/details/109632573
Recomendado
Clasificación