Você está na página 1de 36

Tabelas Hash

Roteiro
• Tabelas Hash
– Definição e Aplicações
– Funções Hashing
– Tratamento de Colisões
– Endereçamento Aberto
– Endereçamento Fechado

2
Unidade 01

ARMAZENAMENTO EM MAPAS

3
Armazenamento em Mapas
• Mapas
– permite o armazenamento de dados por meio da
relação entre valores e chaves
coluna de
valores
Nome Telefone
coluna de Ana 5523-2345
chaves Carlos 4325-8888
José 3455-2234
Paulo 3432-7665
Roberto 5646-6644

4
Armazenamento em Mapas
• Mapas
– Os mapas podem ser considerados como Tabelas
– Para adicionar novas informações, ou novos pares,
ao mapa utilizamos:

Mapa[“Flávio”] =
“4563-2233”

5
Armazenamento em Mapas
• Mapas
– Assim, temos:

Nome Telefone
Ana 5523-2345
Carlos 4325-8888
Flávio 4563-2233
José 3455-2234
Paulo 3432-7665
Roberto 5646-6644

6
Armazenamento em Mapas
• Mapas
– Os valores são recuperados por meio das chaves

cout << Mapa[“Carlos”]

Saída (resultado):

4325-8888

7
Armazenamento em Mapas
• Mapas
– Esses mapas são, em geral, implementados por
meio de Listas
– Uma Lista (ou Tabela) guarda os índices das
posições dos valores

8
Armazenamento em Mapas
• Mapas
Nome pos
Ana 3
Carlos 6
Idx Telefone
Flávio 5
1 3455-2234
José 1
2 5646-6644
Paulo 4
3 5523-2345
Roberto 2
4 3432-7665
5 4563-2233
6 4325-8888

9
Armazenamento em Mapas
• Problemas
– Como mapear chaves em valores?
– Como recuperar informações em tempo constante
O(1) ?

10
Unidade 01

TABELAS HASH

11
Tabelas Hash
• Objetivo
– realizar operações de inserção, remoção e busca
em tempo constante
• Função Hash
– é uma função que calcula (ou descobre) a posição
de um valor na tabela a partir da sua chave

chave função hash valore


s s

12
Tabelas Hash
• Função Hash (características)
– ser simples de calcular rápidez
– assegurar que elementos distintos possuam
índices distintos
• função injetora: cada posição corresponde a uma
única chave
– gerar uma distribuição equilibrada para os
elementos dentro da tabela
• os valores não pode ficar aglomerados em
determinadas partes da tabela
Tabelas Hash
• Funções Hash
– criar uma função Hash nem sempre é uma tarefa
simples
– uma boa função Hash é aquela em que toda
entrada da tabela de valores possui a mesma
probabilidade de ser atingida pela função
Tabelas Hash

• Método da Divisão
– utiliza o tamanho da tabela como função de
espalhamento
– exemplo:
• suponha que os elementos da tabela são números
inteiros
• a função hash h(x) pode ser definida:

h(x) = x % tamanhotabela
Tabelas Hash
• Método da Divisão
– Principal problema:
• elementos distintos podem receber o mesmo índice na
tabela de valores, por exemplo:
– h(100) = 100 % 100 posição 0
– h(200) = 200 % 100 posição 0
– h(300) = 300 % 100 posição 0 colisões no
armazenamento dos
– h(400) = 400 % 100 posição 0 valores
– h(500) = 500 % 100 posição 0

– Utilizar o tamanhotabela como sendo um número


primo minimiza o problema e é uma ideia muito
empregada
Tabelas Hash
• Método da Divisão
– Para casos em que o conjunto de elementos é
formado por string, uma função hash pode ser
obtida somando os valores ASCII dos caracteres
– Por exemplo:
• chave = “Ana” (65+110+97) posição 272 na tabela de
valores
Tabelas Hash
• Hashing Universal
– Qualquer função hash está sujeita ao problema de
criar chaves iguais para elementos distintos.
– Dependendo da entrada, algumas funções hash
podem espalhar os elementos de forma mais
equilibrada que outras
– Desta forma, se puder utilizar diferentes funções
hash, teremos em média um espalhamento mais
equilibrado.
Tabelas Hash
• Hashing Universal
– O hashing universal é uma estratégia para
minimizar o problema de colisões.
– Ideia
• escolher aleatoriamente (em tempo de execução) uma
função hash a partir de um conjunto de funções
• Assim, temos:

h(x) = f(i) * x % tamanhotabela

função escolhida a partir do conjunto de funções


Tabelas Hash
• Tratamento de Colisões
– Em aplicações práticas é difícil conseguir evitar o
problema de colisão de chaves, assim, torna-se
necessário estudar alternativas para o problema
de colisões, dentre elas:
• Endereçamento Fechado
– Também conhecido como Encadeamento Separado ou Externo
• Endereçamento Aberto
Tabelas Hash
• Endereçamento Fechado
– Separate Chaining
– Os elementos que
possuem chaves
iguais são colocados
em uma lista
encadeada
– Pior caso: O(1)
– Busca: proporcional
ao tamanho da lista
encadeada
21
Tabelas Hash
• Endereçamento Aberto
– Open Addressing
– Também conhecido do Rehash
– Todos os elementos são armazenados na própria
tabela hash, com isso não são utilizadas listas
evitando o uso de ponteiros.
– Vantagem
• quantidade de memória utilizada para armazenar os
ponteiros é utilizada para aumentar o tamanho da
tabela

22
Tabelas Hash
• Endereçamento Aberto
– Para inserir um novo elemento, a tabela é
examinada sucessivamente até encontrar uma
posição vazia
– Caso a posição esteja ocupada a função é aplicada
novamente
– Um ponto importante é que a tabela não é
percorrida completamente pois depende do
elemento inserido

23
Tabelas Hash
• Endereçamento Aberto
– Estratégias para definição da função Hash
• Espalhamento Linear
• Espalhamento Quadrático
• Espalhamento Duplo

24
Tabelas Hash
• Endereçamento Aberto
– Espalhamento Linear (Rehash linear)
• A posição da tabela para o elemento x é calculada como
se segue:

h(x) = (h’(x)+i) % tamanhotabela

número de vezes que o índice foi reaplicado

25
Tabelas Hash
• Endereçamento Aberto
– Espalhamento Linear (Rehash linear)
• Exemplo
– Considere a inserção dos caracteres ‘C’, ‘H’, ‘A’, ‘V’, ‘E’ e ‘S’
nessa ordem utilizando uma tabela com 7 posições

26
Tabelas Hash
• Exemplo:
– representação dos elementos por meio dos valores
da tabela ASCII
Elemento ASCII
C 67
H 72
A 65
V 86
E 69
S 83

27
Tabelas Hash
• Exemplo:
– Inserção do elemento ‘C’ = 67
• i = 0 nenhuma colisão
• h(67) = (67+i) % 7 Tabela Hash
• h(67) = 4 0
1
2
3
4 C
5
6

28
Tabelas Hash
• Exemplo:
– Inserção do elemento ‘H’ = 72
• i = 0 nenhuma colisão
• h(72) = (72+0) % 7 Tabela Hash
• h(72) = 2 0
1
2 H
3
4 C
5
6

29
Tabelas Hash
• Exemplo:
– Inserção do elemento ‘A’ = 65
• i = 0 nenhuma colisão
• h(65) = (65+0) % 7 Tabela Hash
• h(65) = 2 colisão 0
•i=1 1
• h(65) = (65+1) % 7 2 H
• h(65) = 3 3 A
4 C
5
6

30
Tabelas Hash
• Exemplo:
– Inserção do elemento ‘V’ = 86
• i = 0 nenhuma colisão
• h(86) = (86+0) % 7 Tabela Hash
• h(86) = 2 colisão 0
• h(86) = (86+1) % 7 1
i=1
• h(86) = 3 colisão 2 H
• h(86) = (86+2) % 7 3 A
i=2
• h(86) = 4 colisão 4 C
• h(86) = (86+3) % 7 5 V
i=3
• h(86) = 5
6

31
Tabelas Hash
• Exemplo:
– Inserção do elemento ‘E’ = 69
• i = 0 nenhuma colisão
• h(69) = (69+0) % 7 Tabela Hash
• h(69) = 6 0
1
2 H
3 A
4 C
5 V
6 E

32
Tabelas Hash
• Exemplo:
– Inserção do elemento ‘S’ = 83
• i = 0 nenhuma colisão
• h(83) = (83+0) % 7 Tabela Hash
• h(83) = 6 colisão 0 S
•i=1 1
• h(83) = (83+1) % 7 2 H
• h(83) = 0 3 A
4 C
5 V
6 E

33
Tabelas Hash
• Endereçamento Aberto
– Espalhamento Quadrático (Rehash quadrático)
• A posição da tabela para o elemento x é calculada como
se segue:
h(x) = h’(x)+c1i+c2i % tamanhotabela

são constantes diferentes de zero

34
Tabelas Hash
• Endereçamento Aberto
– Espalhamento Duplo (Rehash duplo)
• A posição da tabela para o elemento x é calculada como
se segue:
h(x) = h1(x)+ih2(x) % tamanhotabela

funções hash auxiliares

35
FIM

36

Você também pode gostar