Você está na página 1de 5

1

Hashing (ou espalhamento)


O que Hashing?
Uma funo de espalhamento (funo hash) h(k) transforma uma chave k em um endereo. Este endereo usado como a base para o armazenamento e recuperao de registros. similar a uma indexao, pois associa a chave ao endereo relativo do registro. Diferenas: no espalhamento os endereos parecem ser aleatrios - no existe conexo bvia entre a chave e o endereo, apesar da chave ser utilizada no clculo do endereo; no espalhamento duas chaves podem levar ao mesmo endereo (coliso) - portanto, colises devem ser tratadas. Colises Exemplo: Suponha que desejamos armazenar 75 registros em um arquivo, sendo que a chave para os registros um campo sobrenome. Suponha que foi reservado espao para manter 1.000 registros. Os registros podem ser "espalhados", por exemplo, atravs do seguinte procedimento: pega os dois primeiros caracteres do sobrenome e obtm suas representaes ASCII (cdigo numrico); multiplica estes nmeros e usam os trs dgitos menos significativos do resultado para servir de endereo. Exemplo: nome: Maria da Silva sobrenome: Silva dois primeiros caracteres do sobrenome: Si (S = 83) * (i = 105) = 8715 endereo: 715 Observe que os registros so colocados em posies aparentemente aleatrias, sem considerar a sua ordem alfabtica. Entretanto, 2 sobrenomes diferentes podem produzir o mesmo endereo. Neste caso, ocorreu uma coliso (as chaves so sinnimas). Solues: Ideal: usar uma funo de espalhamento perfeita, que no produz coliso. Mas isso muito difcil (quase impossvel) para mais de 500 chaves. A soluo prtica tentar reduzir a um valor aceitvel o nmero de colises que podem ocorrer.

Existem vrias maneiras de reduzir o nmero de colises: Espalhamento dos registros. Busca por uma funo, ou algoritmo, que distribua os registros relativamente por igual entre os endereos disponveis (de forma razoavelmente aleatria). Problema no algoritmo do exemplo : chaves comeando com Si so muito mais comuns do que chaves comeando com Xz, por exemplo.

2 Utilizao de mais memria: relativamente fcil achar um bom algoritmo quando se pode espalhar poucos registros em muitos endereos, em outras palavras, desperdiar muito espao (no exemplo: 75/1000=7,5%).

Um Algoritmo Simples de Espalhamento O objetivo que a funo "espalhe" as chaves da maneira mais uniforme possvel entre os endereos disponveis. O algoritmo tem 3 passos: 1. representao da chave numericamente (caso a chave no seja numrica). Por exemplo, usa os cdigos ASCII dos caracteres (todos) para formar um nmero. Por exemplo: LOWELL$$$$$$ = 76 79 87 69 76 76 32 32 32 32 32 32 2. subdiviso e soma (fold and add): subdivide o nmero em partes e soma as partes. No caso, subdivimos o nmero que descreve a chave em pares de cdigos ASCII, que so tratados como valores inteiros, ao invs de caracteres: 76 79 | 87 69 | 76 76 | 32 32 | 32 32 | 32 32 Estes nmeros inteiros podem ser somados, mas antes precisamos considerar o problema causado pela preciso limitada da mquina: em alguns sistemas, o maior inteiro permitido 32.767 (15 bits), de maneira que se a soma resultar em um valor maior do que este podemos ter um overflow, ou um valor resultante negativo. Por exemplo, somando os primeiros 5 nmeros o resultado 30.588. Somando o ltimo, 3.232, o resultado ser maior que o mximo (33.820), causando um overflow. 3. diviso do resultado da soma pelo espao de endereamento para obter o endereo final. O objetivo deste passo reduzir o tamanho do nmero gerado no passo anterior de forma que ele fique no intervalo de posies endereveis do arquivo. Isto pode ser feito dividindo o resultado pelo nmero total de endereos disponveis, e tomando o resto da diviso inteira, que ser interpretado como o endereo base para o registro. Ou seja, se s o resultado da soma, n o nmero de endereos do arquivo, ento a o endereo, sendo que: a = s MOD n O resto da diviso um nmero entre 0 e n-1. Distribuio de registros entre endereos A funo de espalhamento perfeita (ou uniforme) para um dado conjunto de chaves seria uma que no produzisse nenhum sinnimo em um dado espao de endereamento. A pior funo seria aquela que, qualquer que fosse a chave, geraria sempre o mesmo endereo (todas as chaves seriam sinnimas). Uma funo aceitvel uma que gera poucos sinnimos - em geral, isto mais provvel de ocorrer se usarmos uma funo que distribui as chaves aleatoriamente no conjunto de endereos disponveis.

Agora, como resolver o problema das colises? 1) Espalhamento Duplo Uma segunda funo de espalhamento aplicada novamente toda vez que uma coliso ocorrer. O processo repetido at uma posio livre ser encontrada (para insero ou busca). Vantagem: tende a espalhar melhor as chaves pelos endereos. Desvantagem: os endereos podem estar muito distantes um do outro (o princpio da localidade violado), provocando seekings adicionais. 2) Encadeamento com uma rea de Overflow Separada Outra opo alocar todos os sinnimos numa rea especial de overflow (no final do arquivo, por exemplo). Nesses casos, os endereos sem chaves na rea primria nunca sero ocupados. Vantagens: Resolve o problema de manuteno. Se a rea primria alocada de forma que o tamanho seja suficientemente grande para permitir poucos overflows, rea de overflow pode ser uma simples seqncia de chaves. Desvantagem: overflow sempre requer outro acesso. 3) Scatter Tables: Indexing Revisited Quando, ao invs do registro todo, o arquivo na realidade guarda apenas as chaves e sua posio nos arquivos de dados, o hashing gera, na realidade, um ndice, e o arquivo relacionado chamado scatter table.

Tabelas de Espalhamento
Pode ser representada por um vetor onde cada posio, denominada encaixe, mantm uma classe de partio. O nmero de encaixes na tabela deve coincidir com o nmero de classes criadas pela funo de espalhamento. Considerando que um conjunto P seja espalhado em P1, P2, P3, ..., Pn classes distintas, um vetor T[1..n] pode representar o espalhamento de maneira satisfatria, bastando associar a cada elemento T[i] uma classe Pi, 1 i n correspondente. Admitindo a existncia de elementos sinnimos em P, de se esperar que durante o espalhamento ocorra pelo menos uma coliso, ou seja, possvel que tenhamos que armazenar um elemento numa posio da tabela que j encontre ocupada por um outro valor. Uma forma de resolver este problema chamada de espalhamento externo. No espalhamento externo, a tabela de hashing ser um vetor cujos elementos so ponteiros para listas encadeadas que representam as classes do espalhamento. O mtodo da Diviso Inteira A funo a seguir, transforma as chaves em endereos relativos (para uma tabela contendo N=5 encaixes):
function hash(chave: integer):integer; begin hash:= (chave mod N) + 1; end;

A seguir, os valores de hashing gerados pela funo: hash(54) = (54 mod 5) + 1 = 5 hash(21) = (21 mod 5) + 1 = 2 Transformao de chaves alfanumricas Uma forma simples de se transformar uma chave alfanumrica num valor numrico consiste em considerar cada caractere da chave com um valor inteiro (correspondente ao seu cdigo ASCII) e realizar uma soma com todos eles:
function hash_alfa(chave:string):integer; var i,soma:integer; begin soma:=0; for i:=1 to length(chave) do soma:= soma + ord(chave[i]); hash_alfa:= (soma mod N) + 1; end;

Exemplos (considerando N=7 encaixes): hash_alfa(Thais) = 2 hash_alfa(Bia) = 3

Aplicao com arquivo


rea de Dados (primria)
Funo HASH Endereo = F(chave) 0 1 2 3 4 5 6 7 8 9 10 11 12 NMERO 1950 1600 NOME Enio Eber SALRIO $ 900 $ 800 STATUS T F ELO 16 0 0 0 0 0 0 0 0 0 17 0 14

No exemplo, F(chave)=Numero mod 13

3150 2150 1450 1100 1400 1050 1000

Rui Flavio Diogo Antonio Claudio Afonso Ademar

$ 550 $ 420 $ 1200 $ 750 $ 600 $ 3200 $ 1200

T F T T T T T

rea de Overflow
13 14 15 16 17 NMERO 1700 2300 3000 2600 2766 NOME Edson Gerson Ivan Luis Pedro SALRIO $ 500 $ 800 $ 630 $ 5000 $ 3000 STATUS T T T T T ELO 0 0 13 0 15

COLISO utilizando tratamento por encadeamento (utilizao da rea de extenso (overflow)): Os registros que colidem em um mesmo endereo so armazenados em uma rea de extenso (overflow) e inseridos na lista encadeada correspondente na rea principal (atualizao do campo ELO). INSERO: feita atravs da posio determinada para o armazenamento, atravs da funo HASH. REMOO: em geral lgica. Opes a serem construdas: o Insere o Altera o Consulta o Exclui o Reorganiza (exclui todos os registros marcados com status false) o Relatrio (Exibe todos os registros, inclusive o nmero do registro no arquivo e o campo elo).

Você também pode gostar