HashTables “Tabelas de Espalhamento”docente.ifsc.edu.br/vilson.junior/ed/06_Hash_Tables.pdf ·...

48
Hash Tables “Tabelas de Espalhamento” Estruturas de Dados Prof. Vilson Heck Junior

Transcript of HashTables “Tabelas de Espalhamento”docente.ifsc.edu.br/vilson.junior/ed/06_Hash_Tables.pdf ·...

Hash Tables“Tabelas de Espalhamento”

Estruturas de DadosProf. Vilson Heck Junior

Hash Table

• Como Estrutura de Dados:

– Serve para organizar e armazenar dadosde forma a agilizar o processo depesquisa;

– Pode ser programada de diversasformas, sendo a mais comum com o usode array e listas dinâmicas.

Tabela Hash

• Usos mais comuns:

– Indexação de grandes volumes de informação;

– Classificação por categorias;

– Softwares per-to-per (BitTorrent);

– Entre outros.

Tabela Hash

• São elementos compositores:

– Função Hash (Função de espalhamento);

– Chaves de Pesquisa;

– Índices Hash;

– Array de informações ou de listas de informações.

Função Hash

• Responsável pelo “espalhamento”(distribuição) dos dados, através da geraçãodo índice do elemento com base em umadeterminada chave e operação matemática;

• O desempenho da tabela, como um todo, écompletamente dependente doplanejamento desta função;

• Quanto menos colisões ocorrerem, melhor éa função Hash escolhida, e melhor odesempenho da tabela como um todo.

Função Hash

• Exemplo de Função Hash (1):

– Supondo que queremos dividir todos osnomes de pessoas em um determinadocadastro pela primeira letra (maiúscula)do nome:

public int FuncaoHash(String chave) {

return chave.toUpperCase().charAt(0) – 65;

}

Função Hash

• Exemplo de Função Hash (2):

– Supondo que queremos dividir todos osCPFs de pessoas em um determinadocadastro de 100 em 100 registros:

public int FuncaoHash(long chave) {

return (int)(chave % 100);

}

Chave Hash

• É o valor que será utilizado pelafórmula Hash para o espalhamentodos dados;

• Como no exemplo anterior, a chaveutilizada como parâmetro da função,nada mais é do que uma stringcontendo o nome que se pretendeespalhar separando pela primeiraletra do nome.

Índice Hash

• Índice é o valor que é retornado pelafunção Hash;

• É um número que representa aposição no array de dados aonde ainformação deverá ser inserida.

Array de Informações

• É um array que pode armazenardiretamente os valores, para cadauma das posições resultantes dafunção Hash, ou armazenarreferências para as listas de dadosassociadas a uma determinadaposição fornecida pela Função Hash.

Exemplo

• Distribuindo números de X em X:

– Imagine que temos um banco de dadosde uma instituição bancária.

– Neste banco de dados, definimos comochave para uma tabela Hash o númeroda conta-corrente do cliente.

– Queremos então dividir, através databela Hash, as contas bancarias dosclientes em 6 grupos.

Exemplo

• Distribuindo números de X em X:

– Este banco de dados esta semprecrescendo;

– Por isso não podemos definir limiaresfixos separando grupos de contas. Umadas soluções, seria, separar os númerosdas contas, inclusive as futuras novas,de X em X números.

– Como isto? Segue a demonstração:

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = __

L = 06

R = __

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 99

L = 06

R = __

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99 E = 99

L = 06

R = 03

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 99

L = 06

R = 03

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 99

L = 06

R = 03

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = __

L = 06

R = __

05

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 05

L = 06

R = __

05

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 05

L = 06

R = 05

05

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 05

L = 06

R = 0505

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 05

L = 06

R = 05

05

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = __

L = 06

R = __

05

11

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 11

L = 06

R = __

05

11

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 11

L = 06

R = 05

05

11

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 11

L = 06

R = 05

05

11

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 11

L = 06

R = 05

05

11

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 11

L = 06

R = 05

05

11

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 11

L = 06

R = 05

05

11

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = __

L = 06

R = __

05

11

06

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 06

L = 06

R = __

05

11

06

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 05

L = 06

R = 00

05

11

06

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 05

L = 06

R = 00

05

11

06

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 05

L = 06

R = 00

05

11

06

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = __

L = 06

R = __

05

11

06

20

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 20

L = 06

R = __

05

11

06

20

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 20

L = 06

R = 02

05

11

06

20

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 20

L = 06

R = 02

05

11

06

20

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 20

L = 06

R = 02

05

11

06 20

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = __

L = 06

R = __

05

11

06 20

35

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 35

L = 06

R = __

05

11

06 20

35

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 35

L = 06

R = 05

05

11

06 20

35

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 35

L = 06

R = 05

05

11

06 20

35

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 35

L = 06

R = 05

05

11

06 20

35

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 35

L = 06

R = 05

05

11

06 20

35

Colunas

Ponteiros

Índices

Função Hash

0 1 2 3 4 5

Dados

R = E % L

E

R

L (Largura; Colunas)

Entrada

Saída

99

E = 35

L = 06

R = 05

05

11

06 20

35

Exercícios1. Crie uma função Hash que separa números de CPF de 200 em 200

elementos;

2. Com a função h(k) = k % 11, desenhe o resultado de uma Hash Tablepara os dados: 82, 31, 28, 4, 45, 27, 59, 79, 35;

3. Com a função hash abaixo, desenhe o resultado de uma Hash Table comos seguintes valores:

– 80, 35, 29, 33, 19, 18, 40, 10, 6, 21;

public static int funcaoHash(int valor) {

if (valor % 2 == 0) {

return 0;

} else if (valor % 3 == 0) {

return 1;

}

return 2;

}

Trabalho Hash Table• Uma empresa precisa de um programa de

computador que efetue o cadastro de compradores.Os compradores deverão ser alocados erecuperados rapidamente da memória. Crie oprograma para esta empresa, alocando os“Compradores” em uma hash table.– Use sua criatividade para escolher os

componentes que irá utilizar para construir aHash Table;

– A chave hash deverá ser composta pelo NOMEdo comprador;

– Cada comprador tem os seguintes dados:• Nome;• CPF;• RG;• Telefone.