Você está na página 1de 44

Hashing (Tabela de Disperso)

Prof. Alexandre Parra Carneiro da Silva


http://www.joinville.udesc.br/portal/professores/parra/

Roteiro

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

Colises

Limitaes e demais aplicaes

Roteiro

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

Colises

Limitaes e demais aplicaes

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

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

Colises

Limitaes e demais aplicaes

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

Famlia[1] = Jos Maria Famlia[3] = Artur Famlia[2] = Leila

Em qual posio est 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

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

Colises

Limitaes e demais aplicaes

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

19 20 ... 37 ... 50 ... 85 ...

123.456.781-00; Fausto Silva; Av. Canal. N 45.

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.

Ilustrao de uma Tabela Hash


chave 1 2 dados

Como o registro (com chave K) foi armazenado na posio X na Tabela Hash ao lado?
K registro

registro (chave k)

Resp: Atravs de uma Funo de Hashing.

n-1 n

Como representar Tabelas Hash?

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.

Ilustrao da Funo de Hashing


chave 1 2 dados

Os valores da chave podem ser numricos, alfabticos ou alfa-numricos.

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

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

Colises

Limitaes e demais aplicaes

Hashing Perfeito

Caracterstica:

Para quaisquer chaves x e y diferentes e pertencentes a A, a funo utilizada fornece sadas diferentes;

Exemplo de Hashing Perfeito

(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;

Exemplo de Hashing Perfeito (2/6)

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.

Exemplo de Hashing Perfeito (3/6)

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.

Porque melhor vetor de ponteiros ?

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)

Exemplo de Hashing Perfeito (4/6)


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

Exemplo de Hashing Perfeito (5/6)

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 ?

Exemplo de Hashing Perfeito (6/6)

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; }

Acesso: dada mat tabAlunos[funcao_hash(mat)]

Roteiro

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

Colises

Limitaes e demais aplicaes

Hashing Imperfeito

Caractersticas:

Existe chaves x e y diferentes e pertencentes a A, onde a funo Hash utilizada fornece sadas iguais;

Exemplo de Hashing Imperfeito (1/2)

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).

Exemplo de Hashing Imperfeito (2/2)

Consideraes sobre Funes de Hashing


(1/2)

Na prtica funes de hashing perfeitas ou quase perfeitas:

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.

Consideraes sobre Funes de Hashing


(2/2)

Por causa das colises, muitas Tabelas Hash so aliadas com algumas outras estruturas de dados para solucionar os problemas de coliso, so elas:

Listas Encadeadas; rvores Balanceadas e dentro da prpria tabela.

Roteiro

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

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:

Endereamento Aberto (Rehash); Encadeamento.

Encadeamento

Caracterstica Principal: A informao armazenada em estruturas encadeadas fora da Tabela Hash.


0 1 2 3
KM-1 K5 K1 KM-4 KM K3 K4 K6

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

Endereamento Aberto (Rehash)

Caracterstica Principal:

A informao armazenada na prpria Tabela Hash.

Possui quatro estratgias:


Rehash Linear; Rehash Incremental; Rehash Quadrtica e Rehash Duplo. http://pt.wikipedia.org/wiki/Tabela_hash

Endereamento Aberto: Rehash Linear

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

Exemplo Rehash Linear

(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.

Exemplo Rehash Linear

(2/3)

Exemplo Rehash Linear

(3/3)

Resultado final da Tabela Hash

Roteiro

Contextualizao Conceitos Bsicos Hashing (mtodo de pesquisa)


Hashing Perfeito Hashing Imperfeito Mtodos de Tratamento de Colises

Colises

Limitaes e demais aplicaes

Limitaes

(1/2)

O Hash uma estrutura de dados do tipo dicionrio:


No permite armazenar elementos repetidos. No permite recuperar elementos sequencialmente (ordenado).

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

Demais reas de aplicao de Hashing:


Integridade de Dados; Criptografia e Compactao de Dados.

Você também pode gostar