Prévia do material em texto
Hash Tables “Tabelas de Espalhamento” Estruturas de Dados Prof. Vilson Heck Junior Hash Table • Como Estrutura de Dados: – Serve para organizar e armazenar dados de forma a agilizar o processo de pesquisa; – Pode ser programada de diversas formas, sendo a mais comum com o uso de 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ção do índice do elemento com base em uma determinada chave e operação matemática; • O desempenho da tabela, como um todo, é completamente dependente do planejamento desta função; • Quanto menos colisões ocorrerem, melhor é a função Hash escolhida, e melhor o desempenho da tabela como um todo. Função Hash • Exemplo de Função Hash (1): – Supondo que queremos dividir todos os nomes de pessoas em um determinado cadastro 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 os CPFs de pessoas em um determinado cadastro de 100 em 100 registros: public int FuncaoHash(long chave) { return (int)(chave % 100); } Chave Hash • É o valor que será utilizado pela fórmula Hash para o espalhamento dos dados; • Como no exemplo anterior, a chave utilizada como parâmetro da função, nada mais é do que uma string contendo o nome que se pretende espalhar separando pela primeira letra do nome. Índice Hash • Índice é o valor que é retornado pela função Hash; • É um número que representa a posição no array de dados aonde a informação deverá ser inserida. Array de Informações • É um array que pode armazenar diretamente os valores, para cada uma das posições resultantes da função Hash, ou armazenar referências para as listas de dados associadas a uma determinada posição fornecida pela Função Hash. Exemplo • Distribuindo números de X em X: – Imagine que temos um banco de dados de uma instituição bancária. – Neste banco de dados, definimos como chave para uma tabela Hash o número da conta-corrente do cliente. – Queremos então dividir, através da tabela Hash, as contas bancarias dos clientes em 6 grupos. Exemplo • Distribuindo números de X em X: – Este banco de dados esta sempre crescendo; – Por isso não podemos definir limiares fixos separando grupos de contas. Uma das soluções, seria, separar os números das 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 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íd a 99 E = 35 L = 06 R = 05 05 11 06 20 35 Exercícios 1. 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 Table para 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 com os 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 e recuperados rapidamente da memória. Crie o programa para esta empresa, alocando os “Compradores” em uma hash table. – Use sua criatividade para escolher os componentes que irá utilizar para construir a Hash Table; – A chave hash deverá ser composta pelo NOME do comprador; – Cada comprador tem os seguintes dados: • Nome; • CPF; • RG; • Telefone.