Hashing Ordenação e Pesquisa de Dados Marco Antonio Montebello Júnior [email protected] Transformação de Chave Hashing Transformações de Chave, ou Tabela Hash, ou Tabelas de Dispersão; “Hashing”: fazer picadinho, ou fazer uma bagunça; Técnica que objetiva organizar um conjunto de dados, caracterizados por uma chave, de forma que o acesso tenha o menor custo possível. Transformação de Chave Hashing Os registros armazenados em uma tabela são diretamente endereçados a partir de uma transformação aritmética sobre a chave de pesquisa; O preço pago por esta eficiência será o uso maior de memória. Hashing – Espelhamento Permite agilizar o processo de consulta de informações Não requer a realização de ordenação sobre um conjunto de dados: pesquisa binária e nem a utilização tabelas de índices Tornando a operação de inserção, tão rápida quanto a realização de consulta Hashing – Espelhamento Internet: segurança na troca de mensagens pela Internet - integridade de uma mensagem Integridade de uma mensagem – assegurar que a mensagem original não foi modificada um byte sequer Hashing na Internet Explicação didática do conceito de Hashing – Loja Sears Há muitos anos atrás criou um sistema para controlar a carteira de pedidos de venda comercializados por telefone e catálogo 100 caixas, numeradas de 00 até 99 Os dois dígitos = dois últimos dígitos do número de telefone do cliente Essa função hashing ajudava a pesquisa de um determinado pedido de venda Explicação didática do conceito de Hashing – Loja Sears Para localizar um pedido de venda especifico: nome do cliente e os dois últimos dígitos do número telefônico Todos os pedidos estavam classificados por esses dois números telefônicos Apenas uma das 100 caixas era pesquisada para achar o pedido pelo nome de uma determinada pessoa Explicação didática do conceito de Hashing – Loja Sears A função hashing utilizada pela Sears assegurava: distribuição bastante uniforme dos pedidos pelas caixas Ainda mais, o tempo de pesquisa de um pedido era mais ou menos o mesmo em cada uma das caixas Outro exemplo de Hashing... Transformação de Chave – Hashing Exemplo Suponhamos um sistema acadêmico que utiliza como chave o número de matrícula do aluno (RA) composto por 7 dígitos numéricos; Para permitir a busca à um registro de um aluno com um custo constante poderia ser utilizada a sua própria matrícula como índice de um vetor vet; Se isto fosse feito, poderíamos acessar os dados do aluno cuja matrícula é mat através de vet[mat]; Transformação de Chave – Hashing Exemplo Assim, o acesso ocorre em ordem constante, entretanto o custo de memória para manter esse acesso é muito alto; Vamos considerar que o registro correspondente a cada aluno tenha a seguinte estrutura: Transformação de Chave – Hashing Exemplo Considerando que o número de matrícula é composto por 7 dígitos, ele poderia ser caracterizado por qualquer número entre 0 e 9.999.999; Assim, existe 10 milhões de possíveis números de matrícula; Para isto, seria necessário um vetor com 10 milhões de elementos, que poderia ser estabelecido por: Transformação de Chave – Hashing Exemplo Dessa forma, o nome do aluno de matrícula mat é acessado simplesmente através de vet[mat].nome; Embora o acesso seja rápido o custo de memória é proibitivo; Para a struct definida anteriormente teríamos um gasto de 115 bytes de memória para cada aluno; Assim, o vetor descrito anteriormente consumiria 1.150.000.000 bytes, ou seja, acima de 1 Gbyte de memória; Transformação de Chave – Hashing Exemplo Em uma situação prática, seria comum encontrar um cadastro com algo em torno de 1.000 alunos, o que necessitaria de apenas 115 Kbytes de memória para armazenamento; Uma forma de resolver o problema do gasto excessivo de memória, garantindo um acesso rápido, é através do uso de tabela hash Transformação de Chave – Hashing Exemplo Um método de pesquisa através de hashing, é constituído de duas etapas principais: Computar o valor da função de transformação (função hashing), a qual transforma a chave de pesquisa em um endereço de tabela; Considerando que duas ou mais chaves podem ser transformadas em um mesmo endereço de tabela, é necessário existir um método para lidar com colisões. Transformação de Chave – Hashing Exemplo Mesmo que o número de registros a serem armazenados seja muito menor do que o tamanho da tabela, qualquer que seja a função de transformação, fatalmente ocorrerão algumas colisões; Paradoxo do aniversário (Feller, 1968): “Em um grupo de 23 ou mais pessoas juntas ao acaso, a probabilidade de que 2 pessoas comemorem aniversário no mesmo dia é maior do que 50%.” Transformação de Chave – Hashing Exemplo Assim, em uma tabela com 365 endereços a probabilidade de colisão entre 23 chaves escolhidas aleatoriamente é maior do que 50%; Alta probabilidade de colisões, mesmo com distribuição uniforme; Exemplos: Armazenar registros cuja chave é o RG de pessoas, com 7 dígitos numéricos, em uma tabela com 10000 endereços; Armazenar registros cuja chave consiste de nomes compostos por até 16 letras (2616 chaves possíveis) em uma tabela com 1000 endereços; Transformação de Chave – Hashing Exemplo Funções de Transformação: Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0..M- 1], onde M é o tamanho da tabela; A função ideal é aquela que: seja simples de ser computada; para cada chave de entrada, qualquer uma das saídas possíveis é igualmente provável de ocorrer. Considerando que as transformações sobre as chaves são aritméticas, se houverem chaves não numéricas, elas devem ser transformadas em números; Transformação de Chave – Hashing Exemplo Um dos métodos que funciona muito bem para a transformação de chave, utiliza o resto da divisão por M: h(K) = K mod M Onde K é um inteiro correspondente à chave; Este é um método muito simples; Cuidado na escolha do valor de M: Se M é par, então h(K) é par quando K é par, e h(K) é ímpar quando K é ímpar; Assim, uma boa estratégia é escolher um valor primo para M; Transformação de Chave – Hashing Exemplo Um exemplo de função em linguagem C: Observações Verificar página 3 do arquivo Hashing.pdf Descrevendo o método da divisão inteira Verificar página 10 do arquivo Hashing.pdf Espelhamento para chaves alfanuméricas Verificar página 11 do arquivo Hashing.pdf Tipos de Hashing