Você está na página 1de 49

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.
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.
20 mod 8 = 4 45 mod 8 = 5

0 1 2 3 4 5 6 7

20 ? 64 11 20 7 45 ?
11 ?
11 mod 8 = 3
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
Família
José Maria Leila Artur Jolinda Gisela Alciene

Família[1] = “José Maria”


Família[3] = “Artur” Em qual posição está “Alciene” ?
Família[2] = “Leila”
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)

123.456.781-00 19
37
143.576.342-23
Função de 50
345.365.768-93
879.094.345-45
Hashing 85
999.999.999-99 20
Tabela
Hash 19 123.456.781-00; Fausto Silva; Av. Canal. Nº 45.
20
...
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.
...
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
chave dados
1
2

?
registro (chave k) X K registro

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.


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

chave dados
1 Os valores da chave podem
2 ser numéricos, alfabéticos
ou alfa-numéricos.
registro (K) E = f (K) X K registro

n-1
n

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)
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)
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.

0 KM-1 K4

1 K5 K6

2 K1

3 KM-4 KM K3

M-2 K2

M-1
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.

2 H A V

4 C

6 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

Você também pode gostar