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

HASHING

Marcos Jos Negreiros Gomes


Universidade Estadual do Cear
Curso de Bacharelado em Cincia da Computao

HASHING
uma tcnica para realizar inseres, delees e buscas em
tempo constante - O(1).
TABELA HASHING
uma estrutura de dados vetorial de comprimento fixo,
contendo chaves. Em geral uma chave um STRING com
um valor associado.
TAM_ HASH - uma varivel que representa o tamanho

do vetor da tabela.
FUNO HASH

uma funo que mapea chaves da tabela HASH.


COLISO
Idealmente chaves distintas ocupam clulas distintas da
tabela hashing. possivel que, apesar disto, a funo
hashing enderece uma chave a uma clula da tabela, que j
est ocupada. Isto denominado coliso.

1. TIPOS DE FUNO HASHING


CHAVES INTEIRAS
F(CHAVE) = |CHAVE^3| mod TAM_HASH
F(CHAVE) = |CHAVE| mod TAM_HASH
OBS: Usar sempre TAM_HASH como um nmero
primo (Objetivo: Reduzir colises)
{2, 3, 5, 7, 11...}
CHAVES STRINGS.
TAM_CHAVE

VK
(CHAVE): =

i=1

ORD ( CHAVE[ i ] )

1
F (VK): = VK MOD TAM_HASH

OBS: Opo ruim, apesar de simples, uma vez que


no distribui bem os valores em tabelas longas.

F (CHAVE) = [ ORD( CHAVE [i] ) ] + 27 ORD(CHAVE [2] ) +


729 ORD ( CHAVE[3] ) ] mod TAM_HASH

Se TAM_HASH < 3

27

COMPLETAR CHAVE
COM BRANCOS

N de letras do alfabeto ingls mais o


branco

729 = 272
Para o portugus, sugere-se uma funo que avalie at a
quinta casa.

OBS: As crticas a este modelo referem-se geralmente do


nmero de combinaes de verbetes com at 3 posies
em portugus e/ou ingls, para um tamanho de tabela,
TAM_HASH = 10.007.

VK: = ORD (CHAVE [1])

FOR j: = 2 .... TAM_CHAVE do


VK: = [ VK 32 + ORD (CHAVE (j)) ] mod TAM_HASH
F (CHAVE): = VK

OBS: Opo de clculo atravs de REGRA DE HORNER

n-1

X (i-1) 322

Sendo n o tamanho da chave

i=1

O tratamento de OVERFLOW deve ser feito no compilador


permitindo que haja uma virada natural do valor de VK para chaves
muito longas.

Esta opo a melhor entre as apresentadas para chaves STRINGS ,


porm deve-se tomar cuidado com o tratamento de erro de
OVERFLOW. Se for tratado, no OVERFLOW, a virada do nmero
feita ( LEFT-SHIFTED) tomando-se apenas a parte positiva, de modo
a no prejudicar o processo de endereamento.

TRATAMENTO DE COLISES
OPEN HASHING`- COM LISTAS
O tratamento das colises realizado logo aps a verificao de que
na clula da tabela h pelo menos um elemento inserido. Aqui, a
tabela implementada como um vetor de listas.
FATOR DE CARGA = a quantidade de elementos na maior
lista interna criada pela coliso. Quanto maior for pior o
desempenho da tabela HASH. Neste caso a tabela deve ser
bem grande e a funo de distribuio deve ser tal que =1
Ex: S= {0,1,85,6,36,46,89,112,44}
0

=3

44

46 89

112 85
36
0

10

=2
0

46 36

44 89 112

85

OPEN HASHING`- COM LISTAS


Vantagens
Insero O(1)
Aceita elementos repetidos

Desantagens

Busca e Deleo O(n)


Estrutura de Dados Bsica
Const TH = 5; // Tamanho da Tabela
Lst = record
ind : tipo_indice;
prox : ^lts;
End;

Hash = array[0..TH-1] of ^lst;

TRATAMENTO DE COLISES
OPEN HASHING COM AVL
Aqui, a tabela implementada como um vetor de AVL. Neste caso,
porm a HASHING se comporta como uma estrutura de busca.
FATOR DE BALANCEAMENTO (FB) = a medida que
indica como est a distribuio dos dados na tabela. Ou seja:
TH1

FB

i0

TH

Onde,
i a carga (Altura+1) da AVL na clula i;
TH o tamanho da tabela hashing;
- o fator de carga da Tabela (clula com rvore de maior
altura da tabela)

Ex: S= {0,1,85,6,36,46,89,112,44}
0

112 1

36

44

46

89

85

1
FB

0.571
7

OPEN HASHING`- COM AVL

Vantagens
Deleo e busca O(log n)

Desantagens
Insero O(log n)
No aceita elementos repetidos

Estrutura de Dados Bsica


Const TH = 5; // Tamanho da Tabela
Avl = record

ind : tipo_indice;
esq, dir : ^Avl;
End;

Hash = array[0..TH-1] of ^Avl;

CLOSED HASHING/ OPEN ADDRESSING


Esta estrutura aproveita o conceito do Open Hashing procurando
evitar colises com cargas longas. Preferencialmente opta-se em
distribuir as colises pela tabela at que isto no seja mais possvel.
Ou seja, clulas h0(x), h1(x), h2(x), ..... , ocorrem como tentativas de
se evitar colises dentro da tabela para uma dada chave x, onde
hi(x)= [f(x)+f(i)] mod TAM_HASH.
A funo f: N N, a estratgia de resoluo das colises, tambm
chamada de TENTATIVA OU FUNO DE TENTATIVAS.
O maior nmero de vezes que se pode tentar inser um dado na TH,
depende da tentativa usada. Neste caso a representa este nmero.
O nmero ideal para 0 = Max Tentativas / TH.

TCNICAS DE TENTATIVAS
A . TENTATIVA LINEAR
B . TENTATIVA QUADRTICA
C . DUPLO HASHING

A . TENTATIVA LINEAR
f (i) = i, e h(x)= (x + i) mod TH, , i=0,..., TH-1;
Nmero esperado de tentativas = 1/2 (1+1/(1+)2 )para as
inseres e pesquisas mal sucedidas e 1/2(1+1/1- ) para
pesquisas bem sucedidas.
Ex: S = {89,18,49,60,69}
0

18

89

60
49

Colide com 18
em 4

18

89

18

89

60

(60 mod 7 = 4)
(60+1 mod 7 = 5)

49

60

(60+2 mod 7 = 6)
0

49

69

...
69 mod 7 = 6
69+1 mod 7 = 0

69+2 mod 7 = 1

B. TENTATIVA QUADRTICA
f(i) = i2, ou h(x)=(x + i2 ) mod TH, i=0,..., TH div 2;
Ex: S = {89,18,49,60,69}
0

49

18

89

(60 mod 7 = 4)
(60+12 mod 7 = 5)
(60+22 mod 7 = 1)
0

49

60

18

89

69

TEOREMA: Se a tentativa quadrtica for usada e o tamanho


da tabela mpar, ento um novo elemento pode ser sempre
inserido(=1) se a tabela est pelo menos metade vazia.

C. DUPLO HASHING
f(i) = i * hd (CHAVE)
Aplica-se aqui uma segunda funo hashing sobre a chave,
diferente de f(chave), de modo que se mantenha as tentativas.

Supondo, como sugesto,


hd(chave) = r - (chave mod r)
onde r um primo menor que TAM_HASH.
Note que as tentativas so: hd(chave), 2hd(chave), 3hd(chave),
...

Ex: {89,18,49,60,69}
0

60
(60 mod 7 = 4), r =5 (tomar r como sendo o prox primo depois de 4).
hd(60) =(5-60 mod 5) = 5,
f(1) = (1 * 5) mod 7 =5 (coliso)
f(2) = (2 * 5) mod 7 =3
0

49

60

18

89

69

C. DUPLO HASHING (Outra Funo)


h(x) = hi (CHAVE), onde h0= Chave mod TH, e hi=Chave mod
ProxPrimoMenor(THi-1), i=1,...,k. k acontece quando TH=2.
Para o mesmo exemplo anterior teremos:

Ex: {89,18,49,60,69}

60

TH0=7, (60 mod 7 = 4) (coliso),


TH1=5, (60 mod 5 = 0) (coliso),
TH2=3, (60 mod 3 = 0) (coliso),
TH3=2, (60 mod 2 = 0) (coliso) Elemento no pode ser inserido!
0

49

18

89

69

Meio Aberto - REHASHING


Se a tabela fica muito cheia, o tempo das operaes inicia a
ficar proibitivo na tentativa quadrtica. Isto acontece em geral
quando se tem muitas delees e inseres misturadas s
buscas. Uma soluo construir uma outra tabela que seja pelo
menos duas vezes maior (com uma nova funo hash
associada) e baixar para ela toda a tabela hash original anterior,
calculando o novo valor hash para cada elemento (no
excludo), eliminando em seguida a antiga.

Ex: S = {13,15,24,6,23}
0

6 15 23 24

13

Iniciar tabela com um tamanho primo, e a cada nova tabela


(rehashing) tomar pelo menos o dobro primo mais prximo.
Ex.:
7 13, 1329, 29 59
0

13

15

Principal Desvantagem: Reprocessamento


Principal Vantagem: Tabela Dinmica independente
de previso mal feita e excessiva.

Tabela est muito cheia,


muito provvel haver
impossibilidade de insero
(Teorema Quadrtico)

10

11

12

23 24
Tabela nova para um primo
prximo ao dobro do primeiro
(reduz chances de coliso)

(Aplicao) - Uso apropriado em compiladores que implementam


a ideia de vetores dinmicos.

HASHING MEIO ABERTO (-HMA)


Trata-se aqui da mistura dos mtodos Hashing Aberto (com
AVL) e Fechado (Rehashing). No Hashing Aberto limita-se a
altura das AVLs que iro se formar ao longo da insero. Deste
modo, a estrutura, pode usar a tentativa quadrtica da
Rehashing para posicionar o elemento ao longo da tabela. Se a
tabela no comportar o dado devido a altura das AVL, ter
atingido o mximo () ou algum dado no puder ser includo,
ela dever fazer Rehashing, repassando dado por dado da
tabela antiga para a nova tabela agora dobrada

Ex: S = (13,15,24,6,23,55, 42, 28, 37, 52, 68, 29, 13, 66, 31),
TH=3, =1. Como ficaria a tabela hashing aps a incluso de
S.

55

42

HASHING MEIO ABERTO (-HMA)

Estrutura de Dados

AVL = record
ind : tipo_indice;
h

: word;

esq, dir : ^Avl;


End;

Hashing = array of ^Avl;

Variveis:
lambda, Tho, limite : integer;

Vantagens
Insero, Busca e Deleo O(1)

Desvantagem
Rehashing O(n)

DESEMPENHO DAS HASHINGS Ocorrncia dos Dados


Distribuio Normal

Distribuio de Poisson

Distribuio uniforme
f(X)

1
se
a

P
(
X
)
b

0
, fora
de
[
a
,b
]

1/(b-a)

DESEMPENHO DAS HASHINGS

DESEMPENHO DAS HASHINGS CLOSED HASHING

DESEMPENHO DAS HASHINGS HASHING MEIO ABERTO

DESEMPENHO DAS HASHINGS DIFERENTES TIPOS DE


IMPLEMENTAES DE HASHING MEIO ABERTO (AVL , RB)