Вы находитесь на странице: 1из 28

Universidade Federal do Vale do So Francisco

Curso de Engenharia da Computao

Matemtica Discreta 12
Prof. Jorge Cavalcanti
jorge.cavalcanti@univasf.edu.br - www.univasf.edu.br/~jorge.cavalcanti
1

Hashing


Introduo


Hashing (espalhamento) uma forma simples, fcil de


implementar e intuitiva de se organizar grandes
quantidades de dados.



Permite armazenar e encontrar rapidamente dados por chaves.


Possui como idia central a diviso de um universo de dados a ser
organizado em subconjuntos mais gerenciveis.

Possui dois conceitos centrais:





Tabela de Hashing estrutura que permite acesso aos


subconjuntos;
Funo de Hashing funo que realiza o mapeamento entre
valores da chave e entradas da tabela.

c
h
a
v
e
s

Tabela Hashing
Funo Hashing
h(k)

2
Subconjuntos

Hashing


Por que usar Hashing?




Estruturas de busca sequencial levam tempo at


encontrar o elemento desejado.

Ex: Arrays e listas

Ex: rvores

5 2 6 1 7 8 4 9

2
5

9
6

4
3

Hashing


Por que usar Hashing?








Em algumas aplicaes, necessrio obter o valor com


poucas comparaes, logo, preciso saber a posio em
que o elemento se encontra, sem precisar varrer todas as
chaves.
A estrutura com tal propriedade chamada de tabela
hashing.
A tabela segue a propriedade da funo de hashing
estabelecida.
Ex: h(k)= k mod n, n=8
20 % 8 = 4
0

20 ?

64

45 % 8 = 5
3

11

20

7
7

45 ?
4

Hashing


Ex.: Considere uma chave de identificao numrica com valores


entre 0 e 1000 bem como uma tabela de armazenamento com
entradas indexadas de 1 a 23. Uma funo de hashing simples e
razovel seria:
hash= h:{0,1,...,1000}{1,2,3,...,23}, tal que
para c{0,1,...,1000}, tem-se que:
h(c) = (c mod 23) + 1, onde mod calcula o resto da diviso inteira.
0
134

237

360

387

452

766

1000

Tabela Hashing

16

20

23

Funo Hashing
h(k)

(c mod 23) + 1

Chave
End

Subconjuntos

452

623

766

237

134

360

285

16

20

16

10

Hashing


Ento, se possumos um universo de dados classificveis por


chaves, podemos:




Criar um critrio simples para dividir este universo em subconjuntos


com base em alguma qualidade do domnio das chaves;
Saber em qual subconjunto procurar e colocar uma chave;
Gerenciar esses subconjuntos menores por algum mtodo simples;

Para isso, precisamos:




Saber quantos subconjuntos eu quero criar e uma regra de clculo


que nos diga, dada uma chave, em qual subconjunto devo procurar
pelos dados com esta chave ou colocar este dado, caso seja um
novo elemento;


Esta regra uma Funo de Hashing, tambm chamada de funo de


clculo de endereo, funo de randomizao ou funo de
aleatorizao.

Possuir um ndice que permita encontrar o incio do subconjunto


certo, depois de calcular o hashing. Isto uma tabela de hashing.

Hashing



A funo hash a responsvel por gerar um ndice a partir de


determinada chave.
A Tabela hash pode apontar para posies na forma de
vetores simples ou listas.
c
h
a
v
e
s

Tabela Hashing
Funo Hashing
h(k)

Vetor simples com valores

c
h
a
v
e
s

Tabela Hashing
Funo Hashing
h(k)

Vetor de listas

Hashing


Ex.:

Hashing


Funo de Hashing





Possui o objetivo de transformar o valor de chave de um


elemento de dados em uma posio para este elemento em
um dos b subconjuntos definidos.
Deve procurar dividir o universo de chaves K = {k0,..,km}
em b subconjuntos de mesmo tamanho.
A probabilidade de uma chave kj pertencente a K
aleatria qualquer cair em um dos subconjuntos bi: i
pertencente a [1,b] deve ser uniforme.
Se a funo de Hashing no dividir K uniformemente entre
os bi, a tabela de hashing pode degenerar.


O pior caso de degenerao aquele onde todas as chaves


caem em um nico conjunto bi.

A funo "primeira letra" do exemplo anterior um


exemplo de uma funo ruim.


A letra do alfabeto com a qual um nome inicia no


distribuda uniformemente. Quantos nomes comeam com
"X"?
9

Hashing


Uma funo de Hashing deve procurar satisfazer as


seguintes condies:









Ser simples de calcular;


Assegurar que elementos distintos tenham ndices distintos;
Gerar uma distribuio equilibrada para os elementos
dentro do array ou subconjuntos;
Deve ser aleatria, ou pseudo-aleatria, para prevenir
adivinhaes do valor original;
Deve ser nica, onde praticamente impossvel dois
endereos diferentes serem gerados a partir da mesma
chave.
Deve ter mo nica, o que significa ser muito difcil a partir
do endereo e dos valores originais obter a funo.
A forma de transformao mais simples e utilizada a
Diviso, como vista anteriormente:


h(kj) = mod(kj,b) + 1, onde b (preferencialmente um


nmero primo) o nmero de subconjuntos em dividimos os
dados.
10

Hashing

A funo ideal aquela que gera um endereo diferente para


cada um dos possveis valores das chaves (Funo injetora).
Porm nem sempre possvel e ai geram colises, ou seja,
em alguns casos, podem ser atribudos mesmos endereos a
chaves com valores diferentes.

Diferenas entre hashing e indexao:

No espalhamento os endereos parecem ser aleatrios


no existe conexo bvia entre a chave e o endereo,
apesar da chave ser utilizada no clculo do endereo
No espalhamento duas chaves podem levar ao mesmo
endereo (coliso) portanto as colises devem ser
tratadas.

11

Hashing


Chaves no-numricas:


Ex.:Suponha que foi reservado espao para manter 1.000


registros e considere a seguinte h(K):
Obter as representaes ASCII dos dois primeiros caracteres do
nome;
Multiplicar estes nmeros e usar os trs dgitos menos significativos
do resultado para servir de endereo.
Nome

Cod ASCII 2
primeiras letras

Produto

Endereo

BALL

66 65

66 x 65 = 4.290

290

LOWELL

76 96

76 x 96 = 6.004

004

TREE

84 82

84 x 82 = 6.888

888

12

Hashing


Continuao Exemplo:




O ideal usar uma funo de espalhamento perfeita, que no


produz coliso, mas...
Duas palavras diferentes podem produzir o mesmo endereo
(coliso), pois as chaves so sinnimas


Temos, h(LOWELL)=h(LOCK)=h(OLIVER)

13

Hashing


Colises




Coliso: quando duas ou mais chaves so mapeadas na mesma


posio da tabela de hash;
Tipicamente, o nmero de posies numa tabela de hash
pequeno comparado com o universo de chaves possveis;
A maioria das funes de hash usadas na prtica mapeiam
vrias chaves na mesma posio na tabela de hash.

Problemas de hashing:



Encontrar funes de hash que distribuam as chaves de modo


uniforme e minimizem o nmero de colises;
Resolver colises.

14

Hashing
Colises


Devido ao fato de existirem mais chaves que posies,


comum que vrias chaves sejam mapeadas na mesma
posio.
Ex: 45 % 8 = 5
1256 % 15 = 11
21 % 8 = 5
356 % 15 = 11
93 % 8 = 5
506 % 15 = 11
O que fazer quando mais de um elemento for inserido na
mesma posio de uma tabela hash?

15

Hashing
Endereamento Fechado (Closed Addressing)


No endereamento fechado, a posio de insero no


muda, logo, todos devem ser inseridos na mesma
posio, atravs de uma lista ligada em cada uma.

20 % 5 = 0
18 % 5 = 3

20

25

1
2

25 % 5 = 0
coliso com 20

18

4
16

Hashing
Endereamento Fechado (Closed Addressing)


A busca feita do mesmo modo: calcula-se o valor da


funo hash para a chave, e a busca feita na lista
correspondente.
Se o tamanho das listas variar muito, a busca pode se
tornar ineficiente, pois a busca nas listas seqencial:

20

15

11

88

32

60

1
2
3

17

Hashing
Endereamento Fechado (Closed Addressing)


Por esta razo, a funo hash deve distribuir as chaves


entre as posies uniformemente:

15

10

13

31

88

20

Se o tamanho da tabela for um nmero primo, h mais


chances de ter uma melhor distribuio.

18

Hashing
Endereamento Aberto (Open Addressing)


No endereamento aberto, quando uma nova chave


mapeada para uma posio j ocupada, uma nova
posio indicada para esta chave.
A nova posio incrementada at que uma posio
vazia seja encontrada (linear probing):

27 % 8 = 3
0

27 ?

64

11 20 27

19

Hashing
Endereamento Aberto (Open Addressing)
Valores: 52, 78, 48, 61, 81, 120, 79, 121, 92
Funo: hash(k) = k % 13
Tamanho da tabela: 13
0

52 78 79 81 120 121 92

52 92
78
79

81 121
120

10

11

12

48 61

48
61

20

Hashing
Endereamento Aberto Remoo


Para fazer uma busca com endereamento aberto, basta


aplicar a funo hash, e a funo de incremento at que o
elemento ou uma posio vazia sejam encontrados.
Porm, quando um elemento removido, a posio vazia
pode ser encontrada antes, o que significaria fim de busca,
MESMO que o elemento PERTENA tabela:

Insero do 27

27? No

Remoo do 20

64

11 20 27

Busca pelo 27

Fim da busca? Sim


21

Hashing
Endereamento Aberto Remoo


Para contornar esta situao, mantemos um bit (ou um


campo booleano) para indicar que um elemento foi
removido daquela posio:
27? No

64

11 20
X 27

Fim da busca? No


Esta posio estaria livre para uma nova insero, mas


no seria tratada como vazia numa busca.
22

Hashing
Endereamento Aberto Expanso


Nesta poltica de hashing, h o que chamamos de fator


de carga (load factor). Este fator indica a
porcentagem de clulas da tabela hash que esto
ocupadas, incluindo as que foram removidas.
Quando este fator fica muito alto (ex: excede 50%), as
operaes na tabela passam a demorar mais, pois o
nmero de colises aumenta.

9?

64 1

X 11 X

23

Hashing
Endereamento Aberto Expanso


Quando isto ocorre, necessrio expandir o array que


constitui a tabela, e reorganizar os elementos na nova
tabela. Como podemos ver, o tamanho atual da tabela
passa a ser um parmetro da funo hash.

34 40 X 11

95

Tamanho = 7

Tamanho = 13

40

95

34

11
24

Hashing
Endereamento Aberto Expanso


O momento ou critrio para expandir a tabela pode


variar:
 Impossibilidade de inserir um elemento
 Metade da tabela est ocupada
 O load factor atingiu um valor limite escolhido
A terceira opo a mais comum, pois um meio
termo entre as outras duas.

25

Hashing
Quando no usar Hashing?


Muitas colises diminuem muito o tempo de acesso e


modificao de uma tabela hash. Para isso necessrio
escolher bem:
 a funo hash
 o tratamento de colises
 o tamanho da tabela
Quando no for possvel definir parmetros eficientes,
pode ser melhor utilizar rvores balanceadas (como
AVL), em vez de tabelas hash.
+ Hashing em Estruturas de Dados

26

Hashing
Exerccios:
1 - Ilustre a organizao final de uma Tabela Hash aps a
insero das seguintes chaves: 35, 99, 27, 18, 65, 45.
Considere a tabela com tamanho 6 (posies 0 a 5), o
mtodo da diviso inteira como funo de hashing e
tratamento de coliso por endereamento fechado.
Considere tambm que os nmeros possveis de chaves
esto no intervalo entre 1 a 100.
2 - Idem questo anterior, porm o tratamento de
coliso ser por endereamento aberto (linear

probing).

27

Hashing
Exerccios:
3 Seja uma funo h(k) = k % 11 e os dados abaixo
obtidos para uma seqncia de chaves:
key

82

31

28

45

27

59

79

35

h(key)

Resolva as colises por endereamento aberto.

28

Вам также может понравиться