Artigo Diretório
Prefácio
1. O que é uma tabela hash?
Esta é a resposta dada no Baidu:
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.
2. Método de zíper
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:
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.