Escolar Documentos
Profissional Documentos
Cultura Documentos
Cap8 Tabelas Hash
Cap8 Tabelas Hash
Roteiro
Colises
Roteiro
Colises
Contextualizao
Os mtodos de pesquisa vistos at agora buscam informaes armazenadas com base na comparao de suas chaves. Para obtermos algoritmos eficientes, armazenamos os elementos ordenados e tiramos proveito dessa ordenao.
Concluso: os algoritmos mais eficientes de busca mostrados at o momento demandam esforo computacional O(log n).
Veremos agora, o mtodo de pesquisa conhecido como hashing (tabela de disperso) ou mtodo de clculo de endereo. Na mdia dos casos, possvel encontrar a chave com apenas UMA OPERAO de LEITURA.
Roteiro
Colises
Conceitos Bsicos
Arranjos utilizam ndices para armazenar as informaes. Atravs do ndice as operaes sobre arranjos so realizadas no tempo O(1). Arranjos no fornecem mecanismos para calcular o ndice a partir de uma informao armazenada. A pesquisa no O(1). 1 2 3 4 5 6
Famlia
Jos Maria
Leila
Artur
Jolinda
Gisela Alciene
Conceitos Bsicos
Ideal: Parte da informao poderia ser utilizada para recuperar diretamente a informao. Que informao poderia ser utilizada !?
Problema: Esta estratgia exigiria um arranjo muito grande e a maioria das posies seriam desperdiadas.
Roteiro
Colises
Definio de Hash
(1/3)
Hash uma generalizao da noo mais simples de um arranjo comum, sendo uma estrutura de dados do tipo dicionrio. Dicionrios so estruturas especializadas em prover as operaes de inserir, pesquisar e remover. A idia central do Hash utilizar uma funo, aplicada sobre parte da informao (chave), para retornar o ndice onde a informao deve ou deveria estar armazenada.
Definio de Hash
(2/3)
Esta funo que mapeia a chave para um ndice de um arranjo chamada de Funo de Hashing. A estrutura de dados Hash comumente chamada de Tabela Hash.
Definio de Hash
123.456.781-00 143.576.342-23 345.365.768-93 879.094.345-45 999.999.999-99 Tabela Hash
(3/3)
19 37 50 85 20
Funo de Hashing
143.576.342-23; Carla Perez; Rua Celso Oliva. N 27. 345.365.768-93; Gugu Liberato; Av. Atlntica. S/N. 879.094.345-45 ; Hebe Camargo; Rua B. N 100.
Tabela Hash
Em Computao a Tabela Hash uma estrutura de dados especial, que armazena as informaes desejadas associando chaves de pesquisa a estas informaes.
Objetivo: a partir de uma chave, fazer uma busca rpida e obter o valor desejado.
A idia central por trs da construo de uma Tabela Hash identificar, na chave de busca, quais as partes que so significativas.
Como o registro (com chave K) foi armazenado na posio X na Tabela Hash ao lado?
K registro
registro (chave k)
n-1 n
Vetor: cada posio do vetor guarda uma informao. Se a funo de hashing aplicada a um conjunto de elementos determinar as informaes I1, I2, ..., In, ento o vetor V[1... N] usado para representar a tabela hash. Vetor + Lista Encadeada: o vetor contm ponteiros para as listas que representam as informaes.
Funo de Hashing
A Funo de Hashing a responsvel por gerar um ndice a partir de uma determinada chave. O ideal que a funo fornea ndices nicos para o conjunto das chaves de entrada possveis.
A funo de Hashing extremamente importante, pois ela responsvel por distribuir as informaes pela Tabela Hash. A implementao da funo de Hashing tem influncia direta na eficincia das operaes sobre o Hash.
registro (K)
E = f (K)
registro
n-1 n
Executam a transformao do valor de uma chave em um endereo, pela aplicao de operaes aritmticas e/ou lgicas f: C E f: funo de clculo de endereo C: espao de valores da chave (domnio de f) E: espao de endereamento (contradomnio de f)
Roteiro
Colises
Hashing Perfeito
Caracterstica:
Para quaisquer chaves x e y diferentes e pertencentes a A, a funo utilizada fornece sadas diferentes;
(1/6)
Suponha que queiramos armazenar os dados referentes aos alunos de uma determinada turma que ingressaram em um curso especfico. Cada aluno identificado unicamente pela sua matrcula. Na PUC-Rio, o nmero de matrcula dos alunos dado por uma seqncia de 8 dgitos.
struct aluno { int mat; // 4 bytes = 4 bytes char nome[81]; // 1 byte * 81 = 81 bytes char email[41]; // 1 byte * 41 = 41 bytes }; Total = 126 bytes typedef struct aluno Aluno;
O nmero de dgitos efetivos na matrcula so 7, pois o ltimo dgito o de verificao (ou controle). Para permitir um acesso a qualquer aluno em ordem constante, podemos usar o nmero de matrcula do aluno como ndice de um vetor. Um problema que pagamos um preo alto para ter esse acesso rpido. Porque !?
Resp: Visto que a matrcula composta de 7 dgitos, ento podemos esperar uma matrcula variando de 0000000 a 9999999. Portanto, precisaramos dimensionar um vetor com DEZ Milhes de elementos.
Como a estrutura de cada aluno ocupa 126 bytes, ento seriam necessrios reservar 1.260.000.000 bytes, ou seja, acima de 1 GByte de memria. Como na prtica teremos em torno de 50 alunos em uma turma cadastrados no curso, precisaramos na realidade de 7.300 (=126*50) bytes.
Pergunta: Como amenizar o gasto excessivo de memria!? Resp: Utilizando um vetor de ponteiros, em vez de um vetor de estruturas.
Alocao dos alunos cadastrados seria realizada dinamicamente. Portanto, considerando que cada ponteiro ocupa 4 bytes, o gasto excedente de memria seria 40.000.000 bytes. (~= 38 MBytes)
Apesar da diminuio do gasto de memria, este gasto considervel e desnecessrio. A forma de resolver o problema de gasto excessivo de memria, garantindo um acesso rpido, atravs de Hashing.
Pergunta: Como construir a Tabela Hash para armazenar as informaes dos alunos de uma determinada turma de um curso especfico? Resp: Identificando as partes significativas da chave. Analisando a chave: Desconsiderando o ltimo dgito (controle), temos outros dgitos com significados especiais:
97 1 12 34 - 4
chamada do aluno cdigo do curso perodo de ingresso ano de ingresso
Portanto, podemos considerar no clculo de endereo parte do nmero da matrcula. Esta parte mostra a dimenso que a Tabela Hash dever ter. Por exemplo, dimensionando com apenas 100 elementos, ou seja, Aluno* tabAlunos[100].
Pergunta: Qual a funo que aplicada sobre matrculas de alunos da PUC-Rio retorna os ndices da tabela? Resp: Depende qual a turma e o curso especfico dos alunos que devem ser armazenados ?
Supondo que a turma seja do 2 semestre de 2005 (cdigo 052) e do curso de Sistemas de Informao (cdigo 35).
Qual seria a funo de hashing perfeito !?
int funcao_hash(int matricula) { int valor = matricula 0523500; if((valor >= 0) & (valor <=99)) then return valor; else return -1; }
Roteiro
Colises
Hashing Imperfeito
Caractersticas:
Existe chaves x e y diferentes e pertencentes a A, onde a funo Hash utilizada fornece sadas iguais;
Suponha que queiramos armazenar as seguintes chaves: C, H, A, V, E e S em um vetor de P = 7 posies (0..6) conforme a seguinte funo f(k) = k(cdigo ASCII) % P. Tabela ASCII: C (67); H (72); A (65); V (86); E (69) e S (83).
so encontradas apenas onde a coliso no tolervel (nas funes de hashing na criptografia); Quando conhecemos previamente o contedo a ser armazenado na tabela.
Nas Tabelas Hash comuns a coliso apenas indesejvel, diminuindo o desempenho do sistema.
Por causa das colises, muitas Tabelas Hash so aliadas com algumas outras estruturas de dados para solucionar os problemas de coliso, so elas:
Roteiro
Colises
Demais Aplicaes
Colises
Quando duas ou mais chaves geram o mesmo endereo da Tabela Hash, dizemos que houve uma coliso. comum ocorrer colises. Principais causas:
em geral o nmero N de chaves possveis muito maior que o nmero de entradas disponveis na tabela. no se pode garantir que as funes de hashing possuam um bom potencial de distribuio (espalhamento).
Tratamento de Colises
Um bom mtodo de resoluo de colises essencial, no importando a qualidade da funo de hashing. H diversas tcnicas de resoluo de coliso. As tcnicas mais comuns podem ser enquadradas em duas categorias:
Encadeamento
M-2 M-1
K2
Exemplo de Encadeamento
Suponha que queiramos armazenar os caracteres que compem a palavra CHAVES em um vetor de P = 7 posies (0..6) conforme a seguinte funo f(k) = k(cdigo ASCII) % P.
0 1 2 3 4 5 6 E S C H A V
Caracterstica Principal:
Uma das alternativas mais usadas para aplicar Endereamento Aberto chamada de rehash linear. A posio na tabela dada por:
rh(k) = (k + i) % M, onde M a qtd de entradas na Tabela Hash k a chave i o ndice de reaplicao do Hash
(1/3)
Suponha que queiramos inserir, nesta ordem, os caracteres da palavra CHAVES utilizando o mtodo de resoluo de colises Rehash Linear. O nmero de entradas (M) da Tabela Hash a ser criada 7.
(2/3)
(3/3)
Roteiro
Colises
Limitaes
(1/2)
Para otimizar a funo Hash necessrio conhecer a natureza e domnio da chave a ser utilizada.
Limitaes
(2/2)
No pior caso a complexidade das operaes pode ser O(N). Caso em que todos os elementos inseridos colidirem. Hash com endereamento aberto necessitar de redimensionamento. podem
Aplicaes de Hashing