Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

estrutura de dados II – 60 horas
Prof: Juliano Ratusznei.
Email: juliano.ratusznei@unicid.edu.br
A teoria consiste em organizar os dados em estruturas semelhantes a fichários
Criar um índice por ordem alfabética e/ou numérica
Definir estruturas específicas para armazená-los
Separar os dados por tipos e assuntos
HASHING
2
 implementação de tabelas de símbolos por meio de:
 tabelas de dispersão => tabelas de hash.
Um tabela de símbolos é uma tabela com duas colunas:  
uma coluna de chave (keys) 
uma de valor. (values)
 Dizemos que cada linha da tabela é um item.  Cada item associa um valor a uma chave.
Vetores, matrizes, listas ligadas, pilha, fila, entre outros
HASHING – Tabela de símbolos (TS)
3
	chave 		valor
 www.ebay.com 	66.135.192.87
 www.princeton.edu 	128.112.128.15
 www.cs.princeton.edu 	128.112.136.35
 www.harvard.edu 	128.103.60.24
 www.yale.edu 	130.132.51.8
 www.cnn.com 	64.236.16.20
 www.google.com 	216.239.41.99
 www.nytimes.com 	199.239.136.200
 Hashing tem dois ingredientes fundamentais: 
uma função de hashing (estrutura de armazenamento com índices)
um mecanismo de resolução de colisões. (dados podem ser duplicados, evitar duplicatas)
HASHING
4
 Problemática
Imagine um pequeno país que possui 10 mil cidadãos. Considere que esta tabela leva o número do CPF e o nome do cidadão. 
Como armazenar a tabela?
HASHING
5
 chave 		valor
 0586	José Carlos
 0603	Alberto Santos
 0644	Ingrid Silva
 ...		 ...
 3675	Julio de Campos
 
 Como armazenar a tabela?
Vetor com 10 mil posições. Utilizamos a própria 
chave como índice do vetor.
O vetor é conhecido como “tabela de hash” e:
terá muitas posições vagas (desperdício de espaço), mas
a busca (get) e a inseção (put) serão extremamente rápidas.
HASHING
6
 chave 		valor
 0586	José Carlos
 0603	Alberto Santos
 0644	Ingrid Silva
 ...		 ...
 3675	Julio de Campos
 
HASHING
Exemplo 2:  Imagine uma lista ligada cujas chaves são nomes de pessoas. Suponha que a lista está em ordem alfabética.
Para acelerar as buscas, divida a lista em 26 pedaços: como uma lista telefônica
nomes começando com "A“
nomes começando com "B“ ......
7
chave 		valor associado
Antonio Carlos 	8533151 
Arthur Silva 		4210328 
Bruna Carvalho 	7532199 
... 			... 
Vitor Lima 		5535944 
Wellington Silva 	5159760 
Yan Fraga 		9537822 
HASHING
Para acelerar as buscas, divida a lista em 26 pedaços: como uma lista telefônica
nomes começando com "A“
nomes começando com "B“ ......
Assim temos:
um vetor de 26 posições é a tabela de hash
cada posição do vetor aponta para o começo de uma das listas.
8
chave 		valor associado
Antonio Carlos 	8533151 
Arthur Silva 		4210328 
Bruna Carvalho 	7532199 
... 			... 
Vitor Lima 		5535944 
Wellington Silva 	5159760 
Yan Fraga 		9537822 
HASHING
um vetor de 26 posições é a tabela de hash
cada posição do vetor aponta para o começo de uma das listas.
Comparamos com a busca binaria?
Comparamos com a busca sequencial?
9
Funções de hashing
Uma tabela de dispersão ou tabela de hash (hash table) é um vetor cada uma de cujas posições armazena zero, uma, ou mais chaves (e valores associados). 
10
Parâmetros importantes:
M :  número de posições na tabela de hash
N :  número de chaves da tabela de símbolos
    = N/M :  fator de carga (load factor)
Função de espalhamento
Função de hashing (hash function) transforma cada chave em um índice da tabela de hash.
Espalha as chaves utilizando alguma lógica de espalhamento / balanceamento.
Responde a pergunta: Em qual posição da tabela de hash devo colocar esta chave?. 
A função de hashing espalha as chaves pela tabela de hash.
11
Função de espalhamento
A função de hashing espalha as chaves pela tabela de hash.
A função de hashing associa um valor hash (hash value), entre 0 e M−1, a cada chave.
No exemplo dos CPFs temos 1 e a função de hashing é nome.charAt(0). Pois temos sobreposições de elementos.
Nesse caso a função de hashing produz uma colisão quando duas chaves diferentes têm o mesmo valor hash e portanto são levadas na mesma posição da tabela de hash:
12
Função de espalhamento
Exemplo: Chaves são números de identificação (7 dígitos) de estudantes da universidade  e  M vale 100:
Uma possível função de hashing: 2 primeiros dígitos da chave. Outra possibilidade: 2 dígitos do meio. Outra possibilidade: 2 últimos dígitos. Qual dessas espalha melhor as chaves pelo intervalo 0 . . 99?
13
8536152
7210629
8536339
8536002
...
8067490
8536106
8536169
8531845
Função de espalhamento
Outro exemplo: função de hashing que leva qualquer número de CPF brasileiro (que tem nove dígitos)
Correspondente dígito verificador (um número entre 0 e 99). 
Por exemplo, leva 111444777 em 35.) 
O dígito verificador de um CPF depende de todos os dígitos do CPF.
Ideal: a função de hashing deveria usar todos os dígitos da chave; assim, chaves ligeiramente diferentes serão levadas em números muito diferentes. 
podemos usar o valor hash como checksum para verificar a integridade de um dado!
14
Função de espalhamento
15
	Escolha M e a função de hashing de modo a
	diminuir o número de colisões;
 espalhar bem as chaves pelo intervalo 0 . . M−1.
Função de hashing modular
Que funções de hashing são usadas na prática?
Se as chaves são inteiros positivos, podemos usar a função modular
 resto da divisão por M:
Exemplos com M = 100 , M = 43 e M=18
Em hashing modular, é bom que M seja primo (Utilizado pela maioria das funções hash).
16
		Hash		
	Chave	M =100	M=43	M=18
	6613	13	34	7
	374	74	30	14
	9608	8	19	14
	5521	21	17	13
	1830	30	24	12
	8582	82	25	14
	8833	33	18	13
	3073	73	20	13
	7138	38	0	10
	5254	54	8	16
	3756	56	15	12
	101	1	15	11
	3066	66	13	6
	8816	16	1	14
	7941	41	29	3
	8838	38	23	0
	6686	86	21	8
	9767	67	6	11
	460	60	30	10
	588	88	29	12
	6958	58	35	10
	2723	23	14	5
Função de hashing modular
No caso de strings, podemos iterar hashing modular sobre os caracteres da string:
No lugar do multiplicador 43, poderia usar qualquer outro inteiro primo, mas suficientemente pequeno para que os cálculos não produzam sobrecarga do sistema.
17
int hashString(const char *s, int M) {
 int h = 0;
 for (int i = 0; s[i] != '\0'; i++) {
 h = (43 * h + s[i]) % M;
 }
 return h;
}
Hashing Ideal?
Hipótese do Hashing Uniforme:  Vamos supor que nossas funções de hashing distribuem as chaves pelo intervalo de inteiros 0 . . M−1 de maneira uniforme (todos os valores hash igualmente prováveis) e independente.
18
Hashing Ideal?
Exemplo: Supõe-se que os números sorteados pela Loteria Federal são todos igualmente prováveis. Supõe-se também que são independentes:  só porque “13” nunca foi sorteado, ele não tem maior probabilidade de sair no próximo sorteio.
Nenhuma função determinística satisfaz a Hipótese do Hashing Uniforme.  
(Essa impossibilidade é uma questão profunda e fundamental em Ciência da Computação.) 
Mas a hipótese é útil porque permite fazer cálculos para prever o desempenho aproximado de tabelas de hash.
19
Hashing Código
20
Hashing Código
21
Hashing Código
22
Referencias
FEOFILOFF. P. Hashing; Departamento de Ciência da Computação Instituto de Matemática e Estatística da USP
https://www.ime.usp.br/~pf/estruturas-de-dados/aulas/st-hash.html
Atualizado em 21-05-2018
23
image2.png
image3.png
image4.emf
ABCVWY8533151Antonio4210328Arthur Silva7532199Bruna Carvalho5535944Vitor Lima5159760Wellington Silva9537822 Yan FragaBUSCAVetor HashLista de Nomes com A
image1.jpeg
image5.png
image6.png
image7.png
image8.svg
 
.MsftOfcThm_Accent1_Fill {
 fill:#9ACD4C; 
}.MsftOfcThm_Accent1_Stroke {
 stroke:#9ACD4C; 
}
 
image9.png
image10.png
image11.png
image12.png
image13.png
image14.png

Mais conteúdos dessa disciplina