tabelas hash

26
Tabelas Tabelas Hash Hash

Upload: pnunes2606

Post on 05-Jul-2015

465 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Tabelas Hash

Tabelas Tabelas HashHash

Page 2: Tabelas Hash

Tabelas Tabelas HashHashO uso de listas ou árvores para organizar informações é interessante O uso de listas ou árvores para organizar informações é interessante e produz resultados bastante bons.e produz resultados bastante bons.

Entretanto, em nenhuma dessa estruturas se obtém o acesso direto a Entretanto, em nenhuma dessa estruturas se obtém o acesso direto a alguma informação, a partir do conhecimento de sua chave.alguma informação, a partir do conhecimento de sua chave.

Uma maneira de organizar dados, que apresenta bons resultados na Uma maneira de organizar dados, que apresenta bons resultados na prática, é conhecida como prática, é conhecida como hashinghashing , é baseada na idéia de distribuir , é baseada na idéia de distribuir os dados em posições aleatórias de uma tabela.os dados em posições aleatórias de uma tabela.

Pode-se construir uma tabela de forma a facilitar a busca, colocando-Pode-se construir uma tabela de forma a facilitar a busca, colocando-se cada elemento numa posição pré-determinada. se cada elemento numa posição pré-determinada.

Uma tabela Uma tabela hashhash é construída através de um vetor de tamanho é construída através de um vetor de tamanho nn, no , no qual se armazenam as informações.qual se armazenam as informações.

Nele, a localização de cada informação é dada a partir do cálculo de Nele, a localização de cada informação é dada a partir do cálculo de um índice através de uma função de indexação, a função de um índice através de uma função de indexação, a função de hash.hash.

Page 3: Tabelas Hash

Tabelas Tabelas HashHashA posição de um elemento é obtida aplicando-se ao elemento a A posição de um elemento é obtida aplicando-se ao elemento a função de função de hashhash que devolve a sua posição na tabela. Daí basta que devolve a sua posição na tabela. Daí basta verificar se o elemento realmente está nesta posição.verificar se o elemento realmente está nesta posição.

O objetivo então é transformar a chave de busca em um índice na O objetivo então é transformar a chave de busca em um índice na tabela.tabela.

Exemplo: Construir uma tabela com os elementos 34, 45, 67, 78, 89. Exemplo: Construir uma tabela com os elementos 34, 45, 67, 78, 89. Supõe-se uma tabela com 10 elementos e uma função de Supõe-se uma tabela com 10 elementos e uma função de hashhash x%10 x%10 (resto da divisão por 10). (resto da divisão por 10).

--1 indica que não existe elemento naquela posição.1 indica que não existe elemento naquela posição.

ii 00 11 22 33 44 55 66 77 88 99

A[i]A[i] -1-1 -1-1 -1-1 -1-1 3434 4545 -1-1 6767 7878 8989

Page 4: Tabelas Hash

Tabelas Tabelas HashHashint hash(int x) int hash(int x)

{{

return x % 10;return x % 10;

}}

void insere(int a[], int x) void insere(int a[], int x)

{{

a[hash(x)] = x;a[hash(x)] = x;

}}

int busca_hash(int a[], int x) int busca_hash(int a[], int x)

{{

int k;int k;

k = hash(x);k = hash(x);

if (a[k] == x) return k;if (a[k] == x) return k;

return – 1;return – 1;

}}

Page 5: Tabelas Hash

Funções de Funções de HashHashHá muitas maneiras de determinar uma função de Há muitas maneiras de determinar uma função de hashhash. .

DivisãoDivisão Uma função de Uma função de hash hash precisa garantir que o valor retornado seja um precisa garantir que o valor retornado seja um

índice válido para uma das células da tabela.índice válido para uma das células da tabela.

A maneira mais simples é usar o módulo da divisão como A maneira mais simples é usar o módulo da divisão como h(k) = k%S, h(k) = k%S, sendosendo K K um númeroum número ee S S o tamanho da tabela.o tamanho da tabela.

O método da divisão é bastante adequado quando se conhece pouco O método da divisão é bastante adequado quando se conhece pouco sobre as chaves.sobre as chaves.

EnlaçamentoEnlaçamento Neste método a chave é dividida em diversas partes que são Neste método a chave é dividida em diversas partes que são

combinadas ou “enlaçadas” e transformadas para criar o endereço.combinadas ou “enlaçadas” e transformadas para criar o endereço.

Existem 2 tipos de enlaçamento: enlaçamento deslocado e enlaçamento Existem 2 tipos de enlaçamento: enlaçamento deslocado e enlaçamento limite.limite.

Page 6: Tabelas Hash

Funções de Funções de HashHash Enlaçamento deslocadoEnlaçamento deslocado

As partes da chave são colocadas uma embaixo da outra e processadas.As partes da chave são colocadas uma embaixo da outra e processadas.

Por exemplo, um código 123-45-6789 pode ser dividido em 3 partes: 123-Por exemplo, um código 123-45-6789 pode ser dividido em 3 partes: 123-456-789 que são adicionadas resultando em 1368.456-789 que são adicionadas resultando em 1368.

Esse valor pode usar o método da divisão Esse valor pode usar o método da divisão valor%S, valor%S, ou se a tabela ou se a tabela contiver 1000 posições pode-se usar os 3 primeiros números para compor contiver 1000 posições pode-se usar os 3 primeiros números para compor o endereço.o endereço.

Enlaçamento limiteEnlaçamento limite

As partes da chave são colocadas em ordem inversa.As partes da chave são colocadas em ordem inversa.

Considerando as mesmas divisões do código 123-456-789.Considerando as mesmas divisões do código 123-456-789.

Alinha-se as partes sempre invertendo as divisões da seguinte forma 321-Alinha-se as partes sempre invertendo as divisões da seguinte forma 321-654-987.654-987.

O resultado da soma é 1566.O resultado da soma é 1566.

Page 7: Tabelas Hash

Funções de Funções de HashHashMeio-quadradoMeio-quadrado A chave é elevada ao quadrado e a parte do resultado é usada como A chave é elevada ao quadrado e a parte do resultado é usada como

endereço.endereço.

ExtraçãoExtração Neste método somente uma parte da chave é usada para criar o endereço.Neste método somente uma parte da chave é usada para criar o endereço.

Para o código 123-45-6789 pode-se usar os primeiros ou os últimos 4 dígitos Para o código 123-45-6789 pode-se usar os primeiros ou os últimos 4 dígitos ou outro tipo de combinação como 1289.ou outro tipo de combinação como 1289.

Somente uma porção da chave é usada.Somente uma porção da chave é usada.

Transformação da raizTransformação da raiz A chave é transformada para outra base numérica. A chave é transformada para outra base numérica.

O valor obtido é aplicado no método da divisão O valor obtido é aplicado no método da divisão valor%Svalor%S para obter o para obter o endereço.endereço.

Page 8: Tabelas Hash

Tabelas Tabelas HashHash

Suponha agora os elementos 23, 42, 33, 52, 12, 58.Suponha agora os elementos 23, 42, 33, 52, 12, 58.

Com a mesma função deCom a mesma função de hash hash, tem-se mais de um elemento , tem-se mais de um elemento para determinadas posições (42, 52 e 12; 23 e 33). para determinadas posições (42, 52 e 12; 23 e 33).

Pode-se usar a função x%17, com uma tabela de 17 Pode-se usar a função x%17, com uma tabela de 17 posições. posições.

A função de A função de hashhash pode ser escolhida à vontade de forma a pode ser escolhida à vontade de forma a atender da melhor forma a distribuição. atender da melhor forma a distribuição.

0 0 11 22 33 44 55 66 77 88 99 1010 1111 1212 1313 1414 1515 1616

-1-1 5252 -1-1 -1-1 -1-1 -1-1 2323 5858 4242 -1-1 -1-1 -1-1 1212 -1-1 -1-1 -1-1 3333

Page 9: Tabelas Hash

Tabelas Tabelas HashHashA escolha da função é a parte mais importante. A escolha da função é a parte mais importante.

É sempre melhor escolher uma função que use uma tabela com um número razoável de elementos. É sempre melhor escolher uma função que use uma tabela com um número razoável de elementos.

No exemplo se houvesse a informação adicional que todos os elementos estão entre 0 e 99, poderia se No exemplo se houvesse a informação adicional que todos os elementos estão entre 0 e 99, poderia se usar também uma tabela com 100 elementos onde a função de usar também uma tabela com 100 elementos onde a função de hashhash é o próprio elemento. é o próprio elemento.

Mas seria uma tabela muito grande para uma quantidade pequena de elementos.Mas seria uma tabela muito grande para uma quantidade pequena de elementos.

A escolha da função é um compromisso entre a eficiência na busca o gasto de memória.A escolha da função é um compromisso entre a eficiência na busca o gasto de memória.

A idéia central das técnicas de A idéia central das técnicas de hashhash é sempre é sempre espalharespalhar os elementos de forma que os mesmos sejam os elementos de forma que os mesmos sejam rapidamente encontrados.rapidamente encontrados.

Page 10: Tabelas Hash

Colisões – Lista LinearColisões – Lista LinearNo caso geral, não há informações sobre os elementos e seus valores.No caso geral, não há informações sobre os elementos e seus valores.

É comum conhecer apenas a quantidade máxima de elementos que a tabela conterá.É comum conhecer apenas a quantidade máxima de elementos que a tabela conterá.

Problema: Como tratar os elementos cujo valor da função de Problema: Como tratar os elementos cujo valor da função de hashhash é o mesmo? Chamamos tal situação é o mesmo? Chamamos tal situação de colisões.de colisões.

Para tratar as colisões, pode-se colocar o elemento na primeira posição livre seguinte e considerar a Para tratar as colisões, pode-se colocar o elemento na primeira posição livre seguinte e considerar a tabela como circular (o elemento seguinte ao último tabela como circular (o elemento seguinte ao último a[n-1]a[n-1] é o primeiro é o primeiro a[0].a[0]. Isso se aplica tanto na Isso se aplica tanto na inserção de novos elementos quanto na busca.inserção de novos elementos quanto na busca.

Esta técnica é conhecida como Lista Linear, Esta técnica é conhecida como Lista Linear, Linear ProbingLinear Probing ou Sondagem. ou Sondagem.

Page 11: Tabelas Hash

Colisões – Lista LinearColisões – Lista LinearConsidere os elementos do exemplo anterior e a função Considere os elementos do exemplo anterior e a função x%10x%10..

ii 00 11 22 33 44 55 66 77 88 99

A[i]A[i] -1-1 -1-1 4242 2323 3333 5252 1212 -1-1 5858 -1-1

Esta forma de tratamento de colisões tem uma desvantagem que é a Esta forma de tratamento de colisões tem uma desvantagem que é a tendência de formação de grupos de posições ocupadas consecutivas, tendência de formação de grupos de posições ocupadas consecutivas, fazendo com que a primeira posição vazia, na prática, possa ficar fazendo com que a primeira posição vazia, na prática, possa ficar muito longe da posição original, dada pela função de hash. muito longe da posição original, dada pela função de hash.

Para inserir um determinado valor Para inserir um determinado valor xx na tabela, ou para concluir que o na tabela, ou para concluir que o valor não se encontra na tabela, é necessário encontrar a primeira valor não se encontra na tabela, é necessário encontrar a primeira posição vazia após a posição posição vazia após a posição h(x).h(x).

Page 12: Tabelas Hash

ColisõesColisõesint hash(int x) { return x % 10;}int hash(int x) { return x % 10;}int insere(int a[], int x, int n) {int insere(int a[], int x, int n) { int i, cont = 0;int i, cont = 0; i = hash(x); i = hash(x); while (a[i] != -1) // procura a próxima posição livrewhile (a[i] != -1) // procura a próxima posição livre {if (a[i] == x) return –1; // valor já existente na tabela{if (a[i] == x) return –1; // valor já existente na tabela if (++cont == n) return –2; // tabela cheiaif (++cont == n) return –2; // tabela cheia if (++i == n) i = 0; // tabela circularif (++i == n) i = 0; // tabela circular }} a[i] = x; // achou uma posição livrea[i] = x; // achou uma posição livre return i;return i;}}int busca_hash(int a[], int x, int n) {int busca_hash(int a[], int x, int n) { int i, cont = 0 ;int i, cont = 0 ; i = hash(x); i = hash(x); // procura x a partir da posição i// procura x a partir da posição i while (a[i] != x)while (a[i] != x) {if (a[i] == -1) return –1; // não achou x{if (a[i] == -1) return –1; // não achou x if (++cont == n) return –2; // a tabela está cheiaif (++cont == n) return –2; // a tabela está cheia if (++i == n) i = 0; // tabela circularif (++i == n) i = 0; // tabela circular }// encontrou}// encontrou return i;return i;

Page 13: Tabelas Hash

A função de A função de Hash – Hash – Critérios de escolhaCritérios de escolha

A operação “resto da divisão por” (módulo – % em C) é a A operação “resto da divisão por” (módulo – % em C) é a maneira mais direta de transformar valores em índices. maneira mais direta de transformar valores em índices.

Exemplos:Exemplos: Se o conjunto é de inteiros e a tabela é de Se o conjunto é de inteiros e a tabela é de MM elementos, a função elementos, a função

de de hashhash pode ser simplesmente pode ser simplesmente x%Mx%M..

Se o conjunto é de valores fracionários entre Se o conjunto é de valores fracionários entre 0 0 e e 11 com com 88 dígitos dígitos significativos, a função de significativos, a função de hashhash pode ser pode ser x*108%Mx*108%M..

Se são números entre Se são números entre ss e e tt, a função pode ser, a função pode ser ((x-s)/(t-s))*M((x-s)/(t-s))*M

A escolha é bastante livre, mas o objetivo é sempre espalhar A escolha é bastante livre, mas o objetivo é sempre espalhar ao máximo dentro da tabela os valores da função para ao máximo dentro da tabela os valores da função para eliminar as colisões. eliminar as colisões.

Page 14: Tabelas Hash

A função de A função de HashHash

A função de A função de hashhash deve ser escolhida de forma a atender deve ser escolhida de forma a atender melhor a particularidade da tabela com a qual se trabalha. melhor a particularidade da tabela com a qual se trabalha.

Os elementos procurados, não precisam ser somente Os elementos procurados, não precisam ser somente números para se usar números para se usar hashinghashing. .

Uma chave com caracteres pode ser transformada num valor Uma chave com caracteres pode ser transformada num valor numérico.numérico.

Page 15: Tabelas Hash

Colisões - Duplo Colisões - Duplo hashing hashing ouou rehash rehashQuando a tabela está muito cheia a busca seqüencial pode levar a um Quando a tabela está muito cheia a busca seqüencial pode levar a um número muito grande de comparações antes que se encontre o elemento ou número muito grande de comparações antes que se encontre o elemento ou se conclua que ele não está na tabela.se conclua que ele não está na tabela.

No pior caso, no qual a lista está completa (No pior caso, no qual a lista está completa (NN elementos ocupados), deve-se elementos ocupados), deve-se percorrer os percorrer os N N elementos antes de encontrar o elemento ou concluir que ele elementos antes de encontrar o elemento ou concluir que ele não está na tabela.não está na tabela.

A grande desvantagem da Lista Linear é o aparecimento de agrupamentos. A grande desvantagem da Lista Linear é o aparecimento de agrupamentos.

Uma forma de permitir um espalhamento maior é fazer com que o Uma forma de permitir um espalhamento maior é fazer com que o deslocamento em vez de deslocamento em vez de 11 seja dado por uma segunda função de seja dado por uma segunda função de hashhash..

Essa segunda função de Essa segunda função de hashhash tem que ser escolhida com cuidado. tem que ser escolhida com cuidado.

Não deve gerar um valor nulo (Não deve gerar um valor nulo (looploop infinito). infinito).

Deve ser tal que a soma do índice atual com o deslocamento (módulo Deve ser tal que a soma do índice atual com o deslocamento (módulo NN) dê ) dê sempre um número diferente até que os sempre um número diferente até que os NN números sejam verificados. números sejam verificados.

Para isso Para isso N N e o valor desta função devem ser primos entre si.e o valor desta função devem ser primos entre si.

Page 16: Tabelas Hash

Colisões - Duplo Colisões - Duplo hashing hashing ouou rehash rehash

Uma maneira é escolher Uma maneira é escolher NN primo e garantir que a segunda função de primo e garantir que a segunda função de hash hash tenha um valor tenha um valor KK menor que menor que NN. Dessa forma . Dessa forma NN e e KK são primos entre si. são primos entre si.

Existem duas funções de Existem duas funções de HashHash: Uma para usar normalmente e outra para : Uma para usar normalmente e outra para usar quando há colisões. usar quando há colisões.

h1(x)=( x % N ) = C1h1(x)=( x % N ) = C1

h2(x) = ( x % N-1 )+1 = C2h2(x) = ( x % N-1 )+1 = C2 usada quando há colisões usada quando há colisões

Para calcular o primeiro índice usa-se Para calcular o primeiro índice usa-se C1C1; ;

Para calcular o segundo índice (se existir colisões) usa-se (Para calcular o segundo índice (se existir colisões) usa-se (C1+C2) %NC1+C2) %N

Para calcular o terceiro índice usa-se (Para calcular o terceiro índice usa-se (C1+2C2) %NC1+2C2) %N, depois (, depois (C1+3C2) %NC1+3C2) %N, , etc. etc.

N N ee N-1 N-1 são primos entre si, para que o resto entre os são primos entre si, para que o resto entre os 2 2 seja seja diferente de diferente de 00..

Page 17: Tabelas Hash

Colisões - Duplo Colisões - Duplo hashing hashing ouou rehash rehash

Exemplo: Inserir os elementos 5, 10, 12 e 19 na tabelaExemplo: Inserir os elementos 5, 10, 12 e 19 na tabela com com N=7N=7..

h1( x) = x % 7 = C1h1( x) = x % 7 = C1

h2( x ) = ( x % 6 ) +1 = C2 h2( x ) = ( x % 6 ) +1 = C2

5   5      h1 ( 5 ) = 5     h1 ( 5 ) = 5  5 5 está vazioestá vazio; ;

10   10   h1 ( 10 ) = 3 h1 ( 10 ) = 3 3 3 está vazioestá vazio; ;

12   12   h1 ( 12 ) = 5 h1 ( 12 ) = 5 5 5 está ocupado, faz-seestá ocupado, faz-se h2; h2;

12   12   h2 ( 12 ) = 1 h2 ( 12 ) = 1 (C1+C2)%7 (C1+C2)%7 6   6   está vazio; está vazio;

19  19  h1 ( 19 ) = 5 h1 ( 19 ) = 5 5 5 está ocupado, faz-seestá ocupado, faz-se h2; h2;

19   19   h2 ( 19) = 2 h2 ( 19) = 2 (C1+2C2)%7 (C1+2C2)%7 0 0 (5+2*1)%7=0 (5+2*1)%7=0

00 11 22 33 44 55 661919 1010 55 1212

Page 18: Tabelas Hash

Colisões - Duplo Colisões - Duplo hashing hashing ouou rehash rehash

Como a seleção da segunda função de Como a seleção da segunda função de hashhash é livre pode-se escolher é livre pode-se escolher um valor fixo.um valor fixo.

Exemplo : Inserir os elementos Exemplo : Inserir os elementos 25, 37, 48, 59, 32, 44, 70, 81 (nesta ordem) 25, 37, 48, 59, 32, 44, 70, 81 (nesta ordem) com com N=11N=11..

h1( x) = x % 11 = C1h1( x) = x % 11 = C1

h2( x ) = 3 = C2 h2( x ) = 3 = C2

25 25   h1 ( 25 ) = 3   h1 ( 25 ) = 3  está vazioestá vazio;;

37 37   h1 ( 37 ) = 4   h1 ( 37 ) = 4  está vazioestá vazio; ;

48 48   h1 ( 48 ) = 4   h1 ( 48 ) = 4  está ocupado, está ocupado, h2 = (4+3)=7 h2 = (4+3)=7 está vazioestá vazio;;

59 59   h1 ( 59 ) = 4   h1 ( 59 ) = 4  está ocupado, está ocupado, h2 = (4+2*3)= 10h2 = (4+2*3)= 10 está está vaziovazio; ;

Exercício: Completar a tabela com os números restantes.Exercício: Completar a tabela com os números restantes.

Page 19: Tabelas Hash

ColisõesColisões - Hash - Hash com Lista encadeadacom Lista encadeadaPodemos criar uma lista ligada com os elementos que tem a mesma chave em vez Podemos criar uma lista ligada com os elementos que tem a mesma chave em vez de deixá-los todos na mesma tabela. de deixá-los todos na mesma tabela.

Com isso pode-se até diminuir o número de chaves possíveis geradas pela função de Com isso pode-se até diminuir o número de chaves possíveis geradas pela função de hashhash. .

Tem-se, dessa forma, um vetor de ponteiros.Tem-se, dessa forma, um vetor de ponteiros.

Considere uma tabela de inteiros e como função de hash Considere uma tabela de inteiros e como função de hash x%10x%10..

503192

301 81

99 19 79 29

...

A função pode ser melhorada:A função pode ser melhorada: Só inserir se já não estiver na tabela. Para isso seria necessário percorrer a lista até o Só inserir se já não estiver na tabela. Para isso seria necessário percorrer a lista até o

final;final; Inserir elemento de modo que a lista fique em ordem crescente.Inserir elemento de modo que a lista fique em ordem crescente.

Page 20: Tabelas Hash

ColisõesColisõesCada um dos métodos apresentados tem seus prós e contras:Cada um dos métodos apresentados tem seus prós e contras:

A Lista linear é o mais rápido se o tamanho de memória permite A Lista linear é o mais rápido se o tamanho de memória permite que a tabela seja bem esparsa.que a tabela seja bem esparsa.

O Duplo O Duplo hashhash usa melhor a memória mas depende também de um usa melhor a memória mas depende também de um tamanho de memória que permita que a tabela continue bem tamanho de memória que permita que a tabela continue bem esparsa.esparsa.

A Lista ligada é interessante, mas precisa de um alocador rápido A Lista ligada é interessante, mas precisa de um alocador rápido de memória.de memória.

A escolha de um ou outro depende da análise particular do caso.A escolha de um ou outro depende da análise particular do caso.

Page 21: Tabelas Hash

ColisõesColisõesEm particular, a probabilidade de colisão pode ser reduzida Em particular, a probabilidade de colisão pode ser reduzida usando uma tabela suficientemente grande em relação ao usando uma tabela suficientemente grande em relação ao número total de posições a serem ocupadas. número total de posições a serem ocupadas.

Por exemplo, uma tabela com 1000 entradas para uma empresa Por exemplo, uma tabela com 1000 entradas para uma empresa que deseja armazenar 500 posições haveria uma probabilidade que deseja armazenar 500 posições haveria uma probabilidade de 50% de colisão, se fosse feita a inserção de uma nova chave.de 50% de colisão, se fosse feita a inserção de uma nova chave.

Considera-se que, em uma tabela Considera-se que, em uma tabela hash hash bem dimensionada, bem dimensionada, devemos ter 1,5 acessos à tabela, em média, para encontrar um devemos ter 1,5 acessos à tabela, em média, para encontrar um elemento.elemento.

Isto corresponde a uma situação em que metade dos acessos é Isto corresponde a uma situação em que metade dos acessos é feita diretamente, e, para a outra metade, ocorre uma colisão.feita diretamente, e, para a outra metade, ocorre uma colisão.

Page 22: Tabelas Hash

HashHash perfeita perfeitaO ideal para a função O ideal para a função hashhash é que sejam sempre fornecidos é que sejam sempre fornecidos índices únicos para as chaves de entrada. índices únicos para as chaves de entrada.

A função perfeita (A função perfeita (hashhash perfeita) seria a que, para quaisquer perfeita) seria a que, para quaisquer entradas A e B, sendo A diferente de B, fornecesse saídas entradas A e B, sendo A diferente de B, fornecesse saídas diferentes. diferentes.

A tabela deve conter o mesmo número de elementos.A tabela deve conter o mesmo número de elementos.

Nem sempre o número de elementos é conhecido a priori.Nem sempre o número de elementos é conhecido a priori.

Na prática, funções Na prática, funções hashhash perfeitas ou quase perfeitas são perfeitas ou quase perfeitas são encontradas apenas onde a colisão é intolerável (por exemplo, encontradas apenas onde a colisão é intolerável (por exemplo, nas funções nas funções hashhash da criptografia, ou quando se conhece da criptografia, ou quando se conhece previamente o conteúdo da tabela armazenada.previamente o conteúdo da tabela armazenada.

Page 23: Tabelas Hash

ExercíciosExercícios1.1. Escolha uma boa função de Escolha uma boa função de hashhash e o número de elementos da tabela para os e o número de elementos da tabela para os

números: números: 1.2 1.71.2 1.7 1.3 1.3 1.8 1.8 1.42 1.42 1.51 1.51

2.2. Idem para os números:Idem para os números:

7 números entre 0.1 e 0.9 (1 casa decimal)7 números entre 0.1 e 0.9 (1 casa decimal)

15 números entre 35 e 70 (inteiros)15 números entre 35 e 70 (inteiros)

10 números entre -42 e -5 (inteiros)10 números entre -42 e -5 (inteiros)

3.3. Idem com um máximo de 1.000 números entre 0 e 1 com no máximo 5 Idem com um máximo de 1.000 números entre 0 e 1 com no máximo 5 algarismos significativos.algarismos significativos.

4.4. Usando a funçãoUsando a função: : h(K) =K%13h(K) =K%13 insira as chaves:insira as chaves:

18, 41, 22, 44, 59, 32, 31, 7318, 41, 22, 44, 59, 32, 31, 73

5.5. Insira as mesmas chaves usando Insira as mesmas chaves usando Double HashingDouble Hashing com as seguintes funções: com as seguintes funções:h1(K) =K%13h1(K) =K%13

h2(K) =8 - K%8h2(K) =8 - K%8

Page 24: Tabelas Hash

RemoçãoRemoçãoNormalmente não se utilizam tabelasNormalmente não se utilizam tabelas hash hash em situações em que elementos devem em situações em que elementos devem ser removidos, pelas dificuldades impostas pelos esquemas de tratamento de ser removidos, pelas dificuldades impostas pelos esquemas de tratamento de colisões.colisões.

Quando se remove um elemento, a tabela perde sua estrutura de Quando se remove um elemento, a tabela perde sua estrutura de hashhash. .

Suponha que a tabela Suponha que a tabela hash hash a seguir trata colisões por Lista Linear e o elemento a seguir trata colisões por Lista Linear e o elemento xx é é removido.removido.

Com a remoção de Com a remoção de xx apenas apenas uu e e vv continuariam acessíveis: o acesso a continuariam acessíveis: o acesso a ww, , yy e e zz seria perdido. seria perdido.

Para remover Para remover xx, de forma correta, seria necessário mudar diversos outros elementos , de forma correta, seria necessário mudar diversos outros elementos de posição na tabela.de posição na tabela.

Page 25: Tabelas Hash

RemoçãoRemoçãoUma técnica simples, que cria bastante desperdício, é a de marcar a Uma técnica simples, que cria bastante desperdício, é a de marcar a posição do elemento removido como apagada (mas não livre).posição do elemento removido como apagada (mas não livre).

Isso evita a necessidade de movimentar elementos na tabela mas cria Isso evita a necessidade de movimentar elementos na tabela mas cria muito lixo.muito lixo.

Uma melhoria nessa técnica é reaproveitar as posições marcadas Uma melhoria nessa técnica é reaproveitar as posições marcadas como removidas no caso de novas inserções.como removidas no caso de novas inserções.

É eficiente se a freqüência de inserções for equivalente à de remoções.É eficiente se a freqüência de inserções for equivalente à de remoções.

Em casos extremos é necessário refazer o Em casos extremos é necessário refazer o hashinghashing completo dos completo dos elementos.elementos.

Page 26: Tabelas Hash

Tabelas Tabelas HashHash

Embora permita o acesso direto ao conteúdo das Embora permita o acesso direto ao conteúdo das informações, o mecanismo das tabelas informações, o mecanismo das tabelas hashhash possui uma possui uma desvantagem em relação a listas e árvores.desvantagem em relação a listas e árvores.

Numa tabela Numa tabela hashhash é virtualmente impossível estabelecer é virtualmente impossível estabelecer uma ordem para os elementos,ou seja, a função de uma ordem para os elementos,ou seja, a função de hashhash faz indexação, mas não preserva ordem.faz indexação, mas não preserva ordem.