Aula sobre Tabela Hash

CriatividadeZeroDocs 29,705 views 49 slides Oct 27, 2011
Slide 1
Slide 1 of 49
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49

About This Presentation

No description available for this slideshow.


Slide Content

Estrutura de Dados

TABELAS HASH

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Limitações e demais aplicações

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Limitações e demais aplicações

Contextualização
• Dado um conjunto de pares (chave,valor)
–determinar se uma chave está no conjunto e o
valor associado
–inserir um novo par no conjunto
–remover um par do conjunto
• Estruturas que podem ser usadas
– Tabelas simples (vetores ou listas)
– Árvores de busca
– Tabelas de espalhamento (hash)

Contextualização
•Os métodos de pesquisa vistos até agora buscam
informações armazenadas com base na comparação
de suas chaves.

•Para obtermos algoritmos eficientes, armazenamos
os elementos ordenados e tiramos proveito dessa
ordenação.

Contextualização

•Conclusão: os algoritmos mais eficientes de busca
mostrados até o momento demandam esforço
computacional O(n), quando usamos uma tabela
hash, esta pode realizar tais operações em tempo
esperado O(1).

•Veremos agora, o método de pesquisa conhecido
como hashing (tabela de dispersão, espalhamento,
indexação, escrutínio ou método de cálculo de
endereço). Na média dos casos, é possível encontrar
a chave com apenas UMA OPERAÇÃO de LEITURA.

64 11 20 7
0 1 2 3 4 5 6 7
20 ?
20 mod 8 = 4
20 45 ?
45 mod 8 = 5
11 ?
11 mod 8 = 3
11
Contextualização
•Em algumas aplicações, é necessário obter o
valor com poucas comparações, logo, é
preciso saber a posição em que o elemento se
encontra, sem precisar varrer todas as chaves.
•A estrutura com tal propriedade é chamada
de tabela hash.

Contextualização
•A utilização de hashing envolve
–Computar a função de transformação
–Tratar colisões.
•Uma função hash (h) deve:
–Mapear chaves em inteiros entre 0 e N-1, onde N é
o tamanho da tabela.
–Ser de computação simples
–Gerar entradas para a tabela com igual
probabilidade

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Limitações e demais aplicações’

Conceitos Básicos
•Arranjos utilizam índices para armazenar as
informações.

•Arranjos não fornecem mecanismos para calcular
o índice a partir de uma informação armazenada.
A pesquisa não é O(1).
1 2 3 4 5 6
José Maria Leila Artur Jolinda Gisela Alciene
Família
Família[1] = “José Maria”
Família[3] = “Artur”
Família[2] = “Leila”
Em qual posição está “Alciene” ?

Conceitos Básicos
•Ideal: Parte da informação poderia ser utilizada para
recuperar diretamente a informação.


 Que informação poderia ser utilizada !?
Problema: Esta estratégia exigiria um arranjo muito
grande e a maioria das posições seriam desperdiçadas.

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Limitações e demais aplicações’

Definição de Hash (1/3)
•Hash é uma generalização da noção mais simples de
um arranjo comum, sendo uma estrutura de dados
do tipo dicionário.

•Dicionários são estruturas especializadas em prover
as operações de inserir, pesquisar e remover e que
não admitem repetições.

•A idéia central do Hash é utilizar uma função,
aplicada sobre parte da informação (chave), para
retornar o índice onde a informação deve ou deveria
estar armazenada.

Definição de Hash (2/3)
•Esta função que mapeia a chave para um índice de
um arranjo é chamada de Função de Hashing.

•A estrutura de dados Hash é comumente chamada
de Tabela Hash.

Definição de Hash (3/3)
Função de
Hashing
123.456.781-00
143.576.342-23
345.365.768-93
879.094.345-45
19
19 123.456.781-00; Fausto Silva; Av. Canal. Nº 45.
...
37 143.576.342-23; Carla Perez; Rua Celso Oliva. Nº 27.
...
50 345.365.768-93; Gugu Liberato; Av. Atlântica. S/N.
...
85 879.094.345-45 ; Hebe Camargo; Rua B. Nº 100.
...
37
50
85
999.999.999-99
20
20
Tabela
Hash

Tabela Hash
•Em Computação a Tabela Hash é uma estrutura de
dados especial, que armazena as informações
desejadas associando chaves de pesquisa a estas
informações.

•Objetivo: a partir de uma chave, fazer uma busca
rápida e obter o valor desejado.

•A idéia central por trás da construção de uma Tabela
Hash é identificar, na chave de busca, quais as partes
que são significativas.

Ilustração de uma Tabela Hash
registro (chave k)
chave
1
2
X
n-
1 n
Como o registro (com chave K) foi armazenado na
posição X na Tabela Hash ao lado?
Resp: Através de uma Função de Hashing.
?
K registro
dados

Como representar Tabelas Hash?
•Vetor: cada posição do vetor guarda uma
informação. Se a função de hashing aplicada a um
conjunto de elementos determinar as informações
I1, I2, ..., In, então o vetor V[1... N] é usado para
representar a tabela hash.

•Vetor + Lista Encadeada: o vetor contém ponteiros
para as listas que representam as informações.

Como representar Tabelas Hash?

Função de Hashing
A Função de Hashing é a responsável por gerar um índice a
partir de uma determinada chave.

O ideal é que a função forneça índices únicos para o
conjunto das chaves de entrada possíveis.

Função de Hashing
Características desejáveis: eficiência e bom espalhamento.

A função de Hashing é extremamente importante, pois ela
é responsável por distribuir as informações pela Tabela Hash.

A implementação da função de Hashing tem influência direta na
eficiência das operações sobre o Hash.

Função de Hashing
Método mais usado
Usa o resto da divisão por M
H(K)=K mod M
Onde K é um inteiro correspondente à chave.
As chaves não numéricas devem ser transformadas em
números.



n é o número de caracteres da chave
Chave[i] corresponde à representação ASCII do i-ésimo
caracter da chave
p[i] é um inteiro de um conjunto de pesos gerado
randomicamente.

Função de Hashing
Uma boa função hash (ou de hashing) deve
apresentar duas propriedades básicas:
seu cálculo deve ser rápido;
deve gerar poucas colisões.
Escolha de funções h apropriadas tentam
minimizar a probabilidade de ocorrência de
colisões.

Ilustração da Função de Hashing
Executam a transformação do valor de uma chave em um
endereço, pela aplicação de operações aritméticas e/ou lógicas
f: C  E
f: função de cálculo de endereço
C: espaço de valores da chave (domínio de f)
E: espaço de endereçamento (contradomínio de f)
Os valores da chave podem
ser numéricos, alfabéticos
ou alfa-numéricos.
registro (K)
E = f (K) K
chave
1
2
X
n-1
n
registro
dados

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Limitações e demais aplicações

Hashing Perfeito
•Característica:

–Para quaisquer chaves x e y diferentes e pertencentes a A,
a função utilizada fornece saídas diferentes;

Exemplo de Hashing Perfeito (6/6)
•Supondo que a turma seja do 2º semestre de
2005 (código 052) e do curso de Sistemas de
Informação (código 35).
Qual seria a função de hashing perfeito !?

int funcao_hash(int matricula) {
int valor = matricula – 0523500;
if((valor >= 0) & (valor <=99)) then
return valor;
else
return -1;
}
Acesso: dada mat  tabAlunos[funcao_hash(mat)]

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Limitações e demais aplicações

Hashing Imperfeito
•Características:

–Existe chaves x e y diferentes e pertencentes a A, onde a
função Hash utilizada fornece saídas iguais;

Exemplo de Hashing Imperfeito (1/2)
•Suponha que queiramos armazenar as
seguintes chaves: C, H, A, V, E e S em um vetor
de P = 7 posições (0..6) conforme a seguinte
função f(k) = k(código ASCII) % P.

•Tabela ASCII: C (67); H (72); A (65); V (86); E
(69) e S (83).

Exemplo de Hashing Imperfeito (2/2)

Considerações sobre Funções de Hashing (1/2)
•Na prática funções de hashing perfeitas ou quase
perfeitas:
–são encontradas apenas onde a colisão não é tolerável (nas
funções de hashing na criptografia);

–Quando conhecemos previamente o conteúdo a ser
armazenado na tabela.

•Nas Tabelas Hash comuns a colisão é apenas
indesejável, diminuindo o desempenho do sistema.

Considerações sobre Funções de Hashing (2/2)
•Por causa das colisões, muitas Tabelas Hash
são aliadas com algumas outras estruturas de
dados para solucionar os problemas de
colisão, são elas:

–Listas Encadeadas;
–Árvores Balanceadas e
–dentro da própria tabela.

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Demais Aplicações

Colisões
•Quando duas ou mais chaves geram o mesmo
endereço da Tabela Hash, dizemos que houve
uma colisão.

•É comum ocorrer colisões.

•Principais causas:
–em geral o número N de chaves possíveis é muito maior
que o número de entradas disponíveis na tabela.
–não se pode garantir que as funções de hashing possuam
um bom potencial de distribuição (espalhamento).

Tratamento de Colisões
•Um bom método de resolução de colisões é
essencial, não importando a qualidade da
função de hashing.
•Há diversas técnicas de resolução de colisão.
•As técnicas mais comuns podem ser
enquadradas em duas categorias:
–Endereçamento Aberto (Rehash);
–Encadeamento.

Encadeamento (Hashing aberto) 0
1
2
3
M - 2
M - 1
K1
K2
K3
K4
K5
KM
KM-1
K6
KM-4
Característica Principal: A informação é armazenada em
estruturas encadeadas fora da Tabela Hash. Ou seja manter
numa lista ligada as chaves que levam a um mesmo índice na
tabela de hashing.

Exemplo de Encadeamento
•Suponha que queiramos armazenar os caracteres que
compõem a palavra CHAVES em um vetor de P = 7 posições
(0..6) conforme a seguinte função f(k) = k(código ASCII) % P. 0
1
2
3
4
5
6
C
H A V
E S

Encadeamento (Hashing aberto)
•Operações

Endereçamento Aberto (Rehash)
(ou Hashing Fechado)
•Característica Principal:
–A estratégia é utilizar o próprio espaço da tabela que
ainda não foi ocupado para armazenar a chave que
gerou a colisão.
–Quando o número de registros a serem armazenados
na tabela puder ser previamente estimado, então não
haverá necessidade de usar apontadores para
armazenar os registros

Endereçamento Aberto (Rehash)
(ou Hashing Fechado)
•Quando a função hash gera para uma chave
uma posição que já está ocupada, o
procedimento de armazenamento verifica se a
posição seguinte também está ocupada; se
estiver ocupada, verifica a posição seguinte e
assim por diante, até encontrar uma posição
livre.

Endereçamento Aberto (Rehash)
(ou Hashing Fechado)
•Nesse tipo de tratamento, considera-se a
tabela como uma estrutura circular, onde a
primeira posição sucede a última posição.) A
entrada é então armazenada nessa posição.
•Se a busca termina na posição inicialmente
determinada pela função hash, então a
capacidade da tabela está esgotada e uma

Endereçamento Aberto (Rehash)
(ou Hashing Fechado)
•Operações

Endereçamento Aberto (Rehash)
(ou Hashing Fechado)
•Operações

Roteiro
•Contextualização
•Conceitos Básicos
•Hashing (método de pesquisa)
–Hashing Perfeito
–Hashing Imperfeito
•Colisões
–Métodos de Tratamento de Colisões
•Limitações e demais aplicações

Limitações (1/2)
•O Hash é uma estrutura de dados do tipo dicionário:
–Não permite armazenar elementos repetidos.
–Não permite recuperar elementos sequencialmente
(ordenado).
•Para otimizar a função Hash é necessário conhecer a
natureza e domínio da chave a ser utilizada.
•No pior caso a complexidade das operações pode ser
O(N). Caso em que todos os elementos inseridos
colidirem.

Vantagens e Desvantagens
•Vantagens
–Algoritmos simples e eficientes para inserção, retirada e
busca.
–Alta eficiência no custo de pesquisa, que é O(1) para o caso
médio.
•Desvantagens
– nenhuma garantia de balanceamento
– espaço sub-utilizado nas tabelas
– o grau de espalhamento é sensível à função de hashing
utilizada e ao tipo de informação usada como chave.

Aplicações de Hashing
•Algumas áreas de aplicação de Hashing:
–Integridade de Dados
–Criptografia
–Compactação de Dados
–Tabelas de transposição em jogos de xadrez para
computador
–Serviços de DHCP
–Thesaurus
•no que tange à computação, um tesauro representa uma
base de dados contendo tópicos semanticamente
ortogonais, comumente utilizada em tarefas de busca.

Referências
•Notas de aulas Prof. Thales Castro