Transformação de Chave Hashing - din.uem.br yandre/AEDEP/hashing-mini.pdf · colisões proporcionada

  • View
    213

  • Download
    0

Embed Size (px)

Text of Transformação de Chave Hashing - din.uem.br yandre/AEDEP/hashing-mini.pdf · colisões...

1

1

Prof. Y

andre Maldonado

Transformao de Chave(Hashing)

Prof. Yandre Maldonado e Gomes da Costayandre@din.uem.br

UNIVERSIDADE ESTADUAL DE MARINGDEPARTAMENTO DE INFORMTICA

2

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Transformaes de Chave, ou Tabela Hash, ou Tabelas de Disperso;

Hashing: fazer picadinho, ou fazer uma baguna;

Tcnica que objetiva organizar um conjunto de dados, caracterizados por uma chave, de forma que o acesso tenha o menor custo possvel;

Em estruturas tradicionais (j estudadas), se os registros forem mantidos ordenados, algoritmos eficientes podem garantir busca um custo O(log n) ;

3

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Tabelas hash, se bem projetadas, podem garantir buscas um custo constante O(1);

Os registros armazenados em uma tabela so diretamente endereados a partir de uma transformao aritmtica sobre a chave de pesquisa;

O preo pago por esta eficincia ser o uso maior de memria;

2

4

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Exemplo: Suponhamos um sistema acadmico que

utiliza como chave o nmero de matrcula do aluno (RA) composto por 7 dgitos numricos;

Para permitir a busca um registro de um aluno com um custo constante poderia ser utilizada a sua prpria matrcula como ndice de um vetor vet;

Se isto fosse feito, poderamos acessar os dados do aluno cuja matrcula mat atravs de vet[mat];

5

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Assim, o acesso ocorre em ordem constante, entretanto o custo de memria para manter esse acesso muito alto;

Vamos considerar que o registro correspondente a cada aluno tenha a seguinte estrutura:

struct Aluno{

int mat;char nome [80];char email [30];char turma;

};

struct Aluno{

int mat;char nome [80];char email [30];char turma;

};

6

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Considerando que o nmero de matrcula composto por 7 dgitos , ele poderia ser caracterizado por qualquer nmero entre 0 e 9.999.999;

Assim, existe 10 milhes de possveis nmeros de matrcula;

Para isto, seria necessrio um vetor com 10 milhes de elementos, que poderia ser estabelecido por:

#define MAX 10000000

Aluno vet[MAX];

#define MAX 10000000

Aluno vet[MAX];

3

7

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Dessa forma, o nome do aluno de matrcula mat acessado simplesmente atravs de vet[mat].nome ;

Embora o acesso seja rpido o custo de memria proibitivo;

Para a struct definida anteriormente teramos um gasto de 115 bytes de memria para cada aluno;

Assim, o vetor descrito anteriormente consumiria 1.150.000.000 bytes , ou seja, acima de 1 Gbyte de memria;

8

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Em uma situao prtica, seria comum encontrar um cadastro com algo em torno de 1.000 alunos , o que necessitaria de apenas 115 Kbytes de memria para armazenamento;

Uma forma de resolver o problema do gasto excessivo de memria, garantindo um acesso rpido, atravs do uso de tabela hash;

9

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Um mtodo de pesquisa atravs de hashing, constitudo de duas etapas principais: Computar o valor da funo de transformao

(funo hashing), a qual transforma a chave de pesquisa em um endereo de tabela;

Considerando que duas ou mais chaves podem ser transformadas em um mesmo endereo de tabela, necessrio existir um mtodo para lidar com colises ;

4

10

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Mesmo que o nmero de registros a serem armazenados seja muito menor do que o tamanho da tabela, qualquer que seja a funo de transformao, fatalmente ocorrero algumas colises ;

Paradoxo do aniversrio (Feller, 1968):Em um grupo de 23 ou mais pessoas juntas ao acaso, a

probabilidade de que 2 pessoas comemorem aniversrio no mesmo dia maior do que 50%.

11

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Assim, em uma tabela com 365 endereos a probabilidade de coliso entre 23 chaves escolhidas aleatoriamente maior do que 50%;

Alta probabilidade de colises, mesmo com distribuio uniforme;

Exemplos: Armazenar registros cuja chave o RG de pessoas,

com 7 dgitos numricos, em uma tabela com 10000 endereos;

Armazenar registros cuja chave consiste de nomes compostos por at 16 letras (2616 chaves possveis) em uma tabela com 1000 endereos;

12

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Funes de Transformao: Uma funo de transformao deve mapear

chaves em inteiros dentro do intervalo [0..M-1], onde M o tamanho da tabela;

A funo ideal aquela que: seja simples de ser computada; para cada chave de entrada, qualquer uma das

sadas possveis igualmente provvel de ocorrer.

Considerando que as transformaes sobre as chaves so aritmticas, se houverem chaves no numricas, elas devem ser transformadas em nmeros;

5

13

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Um dos mtodos que funciona muito bem para a transformao de chave, utiliza o resto da diviso por M:

h(K) = K mod M Onde K um inteiro correspondente chave;

Este um mtodo muito simples; Cuidado na escolha do valor de M:

Se M par, ento h(K) par quando K par, e h(K) mpar quando K mpar;

Assim, uma boa estratgia escolher um valor primo para M;

14

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Um exemplo de funo em linguagem C:

const n=10, M=7;typedef char TipoChave[n];

int h(TipoChave Chave){int i, Soma=0;for (i=0; i

6

16

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Um estudo de caso: Armazenar dados de alunos utilizando como chave o

RA; Alta probabilidade de colises , mesmo com

distribuio uniforme; Identificando partes significativas da chave :

Nmero de matrcula:

Pode-se adotar uma parte da chave de acordo com o tamanho da tabela que se pretende utilizar;

9 9 2 0 0 0 1

Indicadores seqenciais

Vestibular de ingresso

Ano de ingresso

17

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Para armazenar apenas dados de alunos pertencentes uma determinada turma: Considerando que:

muitos alunos provavelmente ingressaram no mesmo ano; muitos alunos provavelmente ingressaram no mesmo

vestibular; uma tabela de tamanho 100 seria suficiente para armazenar

os dados dos alunos de uma turma;

Poderiam ser tomados os dois ltimos dgitos dos indicadores seqenciais para compor a chave;

9 9 2 0 0 0 1

Indicadores seqenciais

Vestibular de ingresso

Ano de ingresso

18

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Assim, a tabela poderia ser dada por:

Neste caso, o acesso ao nome do aluno cujo nmero de matrcula mat seria dado por:

A funo de busca que mapeia uma chave para um ndice da tabela poderia ser:

Aluno* tab[100];Aluno* tab[100];

vet[mat%100]->nome;vet[mat%100]->nome;

int hash (int mat){

return (mat%100);

}

int hash (int mat){

return (mat%100);

}

7

19

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

De forma geral, para uma tabela de tamanho N, a funo poderia ser dada por:

Na prtica, costuma-se utilizar um nmero primo para estabelecer o tamanho da tabela;

Para minimizar o nmero de colises, utiliza-se como regra emprica [Celes et al., 2004]: Evitar taxa de ocupao superior a 75%; Taxas em torno de 50%, em geral, trazem bons resultados; Taxas menores do que 25% podem representar gasto excessivo

de memria;

int hash (int mat){

return (mat%N);}

int hash (int mat){

return (mat%N);}

20

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Tratamento de colises: Vamos considerar um vetor de ponteiros, dado

por:

Uso da posio consecutiva livre : Os elementos que colidem so armazenados em

posies da tabela ainda no ocupadas; Uma das estratgias consiste em buscar a prxima

posio livre (utilizando incremento circular):

#define N 127

typedef Aluno* Hash[N];

#define N 127

typedef Aluno* Hash[N];

| | | | | | | | | | | o | | | | |

x h(x) busca por posio livre

21

Prof. Y

andre Maldonado

TransformaTransforma o de Chave o de Chave -- HashingHashing

Em uma busca, de