Você está na página 1de 28

Estruturas de Dados e Algoritmos

Introduo a Tabelas Hash


Dalton Serey Departamento de Sistemas e Computao Universidade Federal de Campina Grande
V0.2 2004 Dalton Serey - DSC/UFCG

O que so mapas mesmo?


Mapas relacionam valores a chaves Pense em mapas como tabelas...


Professor Disciplina camilo lp1 jorge grafos joseluce labp1 lula teoria walfredo lp2
coluna de valores

coluna de chaves

V0.2

2004 Dalton Serey - DSC/UFCG

O que so mapas mesmo?


Podemos adicionar novos pares... M[dalton] := edados


Professor Disciplina camilo lp1 jorge grafos joseluce labp1 lula teoria walfredo lp2

V0.2

2004 Dalton Serey - DSC/UFCG

O que so mapas mesmo?


Podemos adicionar novos pares... M[dalton] := edados


Professor Disciplina camilo lp1 dalton edados jorge grafos joseluce labp1 lula teoria walfredo lp2

V0.2

2004 Dalton Serey - DSC/UFCG

O que so mapas mesmo?


Podemos recuperar valores pelas chaves... print M[lula]


Professor Disciplina camilo lp1 dalton edados jorge grafos joseluce labp1 lula teoria walfredo lp2

V0.2

2004 Dalton Serey - DSC/UFCG

O que so mapas mesmo?


Podemos recuperar valores pelas chaves... teoria


Professor Disciplina camilo lp1 dalton edados jorge grafos joseluce labp1 lula teoria walfredo lp2

V0.2

2004 Dalton Serey - DSC/UFCG

Como implementar mapas?


Listas? Conjuntos de pares? Quais os custos dessas implementaes?

V0.2

2004 Dalton Serey - DSC/UFCG

Mapas em Tabelas

Idia:

um vetor!

guardar valores em uma tabela indexada por inteiros... e mapear chaves em posies da tabela... Professor pos camilo 3 dalton 6 jorge 5 joseluce 1 lula 4 walfredo 2 1 2 3 4 5 6 Disciplina labp1 lp2 lp1 teoria grafos edados
2004 Dalton Serey - DSC/UFCG

V0.2

Mapas em Tabelas

Claramente podemos usar um vetor como tabela! A questo : como mapear chaves em valores?
Professor pos camilo 3 dalton 6 jorge 5 joseluce 1 lula 4 walfredo 2

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

A soluo usar uma funo que calcule um valor inteiro a partir da chave em questo... Vamos denominar melhor os elementos envolvidos neste esquema...
U universo de chaves h funo hash T posies na tabela

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas de acesso direto

Se podemos fazer |T| = |U|

ou seja, se podemos alocar uma tabela com uma posio para cada chave, sobrejetora: toda chave leva a alguma posio injetora: cada posio corresponde a uma nica chave observe que, neste caso, m = |U|

Ento, basta adotar h:U {1, 2, ..., m}


Esquema chamado de tabela de acesso direto

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas de acesso direto


O cdigo no pode ser mais simples... E quais os custos?


Insere(Elemento e, Chave c) 1: T[h(c)] := e Remove(Chave c) 1: T[h(c)] := null Elemento Recupera(Chave c) 1: return T[h(c)]

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas de acesso direto


Contudo, nem sempre U pequeno! Por exemplo, suponha que a chave seja a matrcula de um aluno da UFCG...

trata-se de um inteiro de 8 dgitos logo, so 100.000.000 de chaves se cada posio da tabela ocupar mseros 4 bytes, precisamos de mais de 380Mbytes apenas para a tabela... mesmo que o mapa esteja vazio!

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas de acesso direto

Chamemos de K o conjunto das chaves que sero efetivamente armazenadas na tabela Na prtica, |U| >> |K|...

logo, nossa tabela deveria ter a dimenso de |K|... mais que isso seria desperdcio de memria

Como podemos fazer isso? impossvel com tabelas de acesso direto!

Por qu? Para que a funo seja bijetora preciso que U e T tenham a mesma cardinalidade!
2004 Dalton Serey - DSC/UFCG

V0.2

Tabelas Hash

Soluo: relaxar a condio de injetividade! Ou seja, permitiremos que mais de uma chave seja mapeada em uma nica posio da tabela... Como |U| >> |K| = |T|, se tivermos sorte, no uso prtico nunca ocorrero duas chaves que sejam mapeadas para a mesma posio...

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

O problema que onde a Lei de Murphy vale... Coliso: ocorrncia de uma chave cujo valor de hash igual ao de outra chave j armazenada no mapa. O que fazer quando ocorrem colises?

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

Uma soluo simples: ao invs de armazenarmos um valor em cada posio da tabela, armazenamos uma lista de valores... Neste caso, ao ocorrer uma coliso, basta anexar o novo valor lido lista correspondente chave... Como fica o cdigo?

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

Quais os custos das operaes?

Insere(Elemento e, Chave c) 1: T[h(c)].insere(Par(e,c)) Elemento Recupera(Chave c) 1: para cada Par(e,k) em T[h(c)] 2: if k = c 3: return e 4: return null

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

fcil perceber que a insero O(1)... Mas quanto custa Recupera?


Insere(Elemento e, Chave c) 1: T[h(c)].insere(Par(e,c)) Elemento Recupera(Chave c) 1: para cada Par(e,k) em T[h(c)] 2: if k = c 3: return e 4: return null

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

Pior caso: toda a lista T[h(c)] percorrida e ela contm os |K| elementos esperados para o mapa... Como n = |K|, no pior caso, o custo O(n)
Elemento Recupera(Chave c) 1: para cada Par(e,k) em T[h(c)] 2: if k = c 3: return e 4: return null

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

Contudo, este caso s ocorre se a funo mapear todos as chaves armazenadas para uma nica posio! Quais as chances disso ocorrer?
Elemento Recupera(Chave c) 1: para cada Par(e,k) em T[h(c)] 2: if k = c 3: return e 4: return null

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

A idia usar a probabilidade a nosso favor... A escolha da funo de hash feita criteriosamente para minimizar essa probabilidade Na prtica, foramos a chance a ser nula... Isso nos leva a considerar a anlise do caso mdio como melhor estimativa do desempenho para tabelas hash Mas, qual o custo do caso mdio?

V0.2

2004 Dalton Serey - DSC/UFCG

Tabelas Hash

Se escolhermos muito bem a funo de hash, ento teremos uma distribuio uniforme das chaves na tabela... Como a tabela tem o mesmo nmero de posies que de chaves armazenadas, h uma boa probabilidade de que tenhamos 1 chave em cada posio Nessas condies, podemos dizer que o custo esperado da recuperao O(1)
2004 Dalton Serey - DSC/UFCG

V0.2

Tabelas Hash: anlise

Situao de pior caso para o acesso


todos as chaves do mapa em uma nica posio o acesso ocorre nessa mesma posio a chave procurada no est no mapa

A lista tem n elementos, logo o tempo O(n) Qual a validade dessa anlise?

a funo de hash tem que ser terrvel pouqussimas chances de ser realista na prtica
2004 Dalton Serey - DSC/UFCG

V0.2

Tabelas Hash: anlise

Conceito: fator de carga

n = m

o tamanho mdio das listas da tabela. O tempo esperado de acesso

O 1
V0.2 2004 Dalton Serey - DSC/UFCG

Tabelas Hash: anlise


Na prtica, escolhemos m = O(n) Logo,

n = =O 1 O n

E, portanto, o tempo esperado de acesso

O 1O 1=O 1
V0.2 2004 Dalton Serey - DSC/UFCG

Tabelas Hash

Logo, podemos implementar mapas cujas operaes de insero, recuperao e remoo operam em tempo O(1). Com os devidos cuidados, fcil garantir esse desempenho na prtica... O fundamental controlar o fator de carga

controlando o tamanho da tabela com base no nmero de elementos armazenados

...e utilizar uma boa funo de hash!


2004 Dalton Serey - DSC/UFCG

V0.2

Exerccios

D uma olhada no cdigo da class HashMap de Java. Quais as caractersticas necessrias de uma funo de hash a ser usada em uma tabela de acesso direto? E para uma tabela hash? O que uma coliso?

V0.2

2004 Dalton Serey - DSC/UFCG

Você também pode gostar