Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
Tabelas de dispersao
Tabelas de Dispersao
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Tabelas de Dispersao
Sumario
I Definicao. Caracterısticas.
I Resolucao de colisoes: dispersao com listas e dispersao aberta.Teste quadratico.
I Desempenho de tabelas de dispersao.
I Interface de tabela de dispersao.
I Implementacao de tabela de dispersao fechada com testequadratico.
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Tabela de Dispersao
I items de informacao guardados num vector[Tamanho]
I cada chave e mapeada num inteiro entre 0 e Tamanho-1 usadacomo ındice do vector
I mapeamento e designado por funcao de hash
I a funcao devera ser facil de calcular e atribuir a chaves diferentescelulas diferentes.
I como o numero de chaves e em geral maior que Tamanho oproblema torna-se mais complicado
I O problema reside entao em escolher Tamanho, a funcao de hash edecidir como resolver os casos em que mais que uma chave saomapeadas na mesma celula — colisao
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Tabelas de Dispersao versus Arvores binarias
I Arvores binarias simplesI pior caso nas operacoes de manipulacao e O(N)I pior caso surge sistematicamente em usos correntes (ex:
elementos previamente ordenados)
I Tabela de dispersaoI pesquisa baseada na geracao de um inteiro a partir da chaveI tempo medio constante para insercao, remocao e pesquisaI nao requer gestao de memoria especial nem comparacao de
elementosI ocorrencia do pior caso tem probabilidade muito baixa
I AplicacoesI tabelas de sımbolos dos compiladores
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Resolver colisoes - dispersao com listas de encadeamento
I Manter lista de elementos colocados na mesma entrada
I 1 lista com cabecalho em cada entrada da tabelaI escolhe-se insercao a ocorrer na cabeca ou na cauda da lista
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Resolver colisoes - dispersao aberta
I Perante colisao procura-se celula alternativa
I Tenta-se sequencia de celulas H0(x), H1(x), H2(x), ...I Hi (x) = (hash(x) + f(i)) mod TamanhoTabela
I Teste linear: procurar sequencialmente a partir de H0
I primeira posicao livre a seguir a inicial H0 e usada
I tenta-se H0+1, H0+2, ...
I pesquisa ”da a volta” no fim da tabela
I Teste quadratico
I procurar proxima posicao livre a seguir a H com passoquadratico
I tenta-se H0+1, H0+22, H0+32, ...
I e preciso garantir que se pode percorrer a tabela toda
I Hashing duplo
I usar f(x) = i*hash2(x)
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Desempenho com Dispersao com listas de encadeamento
I Factor de carga λ
I razao entre o numero de elementos na tabela e o tamanho databela
I Dispersao com listas de encadeamento
I comprimento medio de cada lista e λI tempo medio de pesquisa: avaliacao da funcao de dispersao +
percurso na listaI pesquisa sem sucesso: numero medio de ligacoes a percorrer e
λI pesquisa com sucesso: numero medio de ligacoes a percorrer e
1 + λ/2
I bom desempenho para λ proximo de 1
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Desempenho com Dispersao aberta
I Dispersao aberta
I com funcao linearI numero de tentativas para insercao
e para pesquisa sem sucesso:1/2 (1 + 1/(1- λ)2)
I numero de tentativas para pesquisa comsucesso:1/2 (1 + 1/(1- λ))
λ= 0.2Ins, Falha: 1.3Sucesso: 1.1λ= 0.8Ins, Falha: 13Sucesso: 3
I caso ideal (sem clustering)I numero de tentativas para insercao
e para pesquisa sem sucesso:1/(1- λ)
I numero de tentativas para pesquisa comsucesso:1/ λ ln (1/(1- λ))
λ= 0.2Ins, Falha: 1.3Sucesso: 1.1λ= 0.8Ins, Falha: 5.0Sucesso: 2.0
I funcao quadratica elimina clustering primarioI na pratica, eficiencia proxima do caso idealI clustering secundario
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Dispersao com Teste Linear – exemplo
hash(x) = x mod 10 f(i) = ivazia apos 89 apos 18 apos 49 apos 58 apos 69
0 49 49 491 58 582 69345678 18 18 18 189 89 89 89 89 89
“Data Structures & Algorithm Analysis in Java”, Weiss
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Dispersao com Teste Quadratico
Teorema Usando teste quadratico e uma tabela cujo tamanho e um
numero primo, um novo elemento pode sempre ser inserido se a tabela
nao estiver preenchida a mais de 50%
I Mostra-se que as primeiras dTam/2e posicoes alternativas sao todasdistintas, por reducao ao absurdoh(x) + i2 (mod Tam) = h(x) + j2 (mod Tam) com i 6= j e 0 < i,j < bTam/2ch(x) + i2 = h(x) + j2 (mod Tam)
i2 = j2 (mod Tam)
i2 - j2 = 0 (mod Tam)(i-j)(i+j) = 0 (mod Tam) (o mesmo que (i-j)(i+j) = k Tam)
Sendo Tam numero primo, (i-j) ou (i+j) tem de ser 0 (mod Tam). Sendo i e j distintos, (i-j) nao e 0;
sendo 0 < i,j < bTam/2c, (i+j) tambem nao e 0. Entao as primeiras dTam/2e posicoes alternativas sao
distintas
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Dispersao com Teste Quadratico
Teorema A geracao de posicoes alternativas no teste quadratico pode
ser feita com apenas uma multiplicacao
I Seja H0 a posicao inicial, Hi−1 a ultima posicao calculada e Hi a proximaHi = H0 + i2 (mod Tam) Hi−1 = H0 + (i-1)2 (mod Tam)Hi - Hi−1 = i2 - (i-1)2 (mod Tam)Hi = Hi−1 + 2i - 1 (mod Tam)O valor de Hi pode assim ser obtido sem operacoes pesadas de multiplicacaoPara calcular o mod:2i-1 e menor que Tam
Hi−1 + 2i - 1 ou e menor que Tam (caso em que o mod se dispensa)ou e pouco maior que Tam (caso em que o modse reduz a subtrair Tam)
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Dispersao com Teste Quadratico – exemplo
hash(x) = x mod 10 f(i) = i2
vazia apos 89 apos 18 apos 49 apos 58 apos 69
0 49 49 4912 58 583 6945678 18 18 18 189 89 89 89 89 89
“Data Structures & Algorithm Analysis in Java”, Weiss
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Dispersao com Teste Quadratico – exemplo
hash(x) = x mod 10 ; f(i) = i* hash2(x) ; hash2(x)= 7 - (x mod 7)vazia apos 89 apos 18 apos 49 apos 58 apos 69
0 69123 58 58456 49 49 4978 18 18 18 189 89 89 89 89 89
“Data Structures & Algorithm Analysis in Java”, Weiss
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Rehasing
I aumentar o tamanho da tabela para o menor numero primo superior a2 * tamanho actual
I preciso copiar todos os elementos nao removidos para o novo vector coma nova funcao (O(N))
I o programador nao se preocupa com o tamanho da tabela
I e preciso estabelecer um criterio para decidir quando copiar
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Interface de Tabela de Dispersao
public interface HashTable{/** Insert into the hash table. If the item is* already present, then replace it with the new item.*/
void insert(Hashable x);
/* Remove from the hash table */void remove(Hashable x) throws ItemNotFound;
/* Find an item in the hash table */Hashable find(Hashable x) throws ItemNotFound;
void makeEmpty();}
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Entrada de Tabela de Dispersao
class HashEntry{Hashable element; // the elementboolean isActive; // false is deleted
public HashEntry(Hashable e){this(e, true);
}
public HashEntry(Hashable e, boolean i){element = e;isActive = i;
}}
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Implementacao de Tabela de Dispersao
public abstract class ProbingHashTable implements HashTable{private static final int DEFAULT TABLE SIZE = 11;protected HashEntry [] array; // The array of elementsprivate int currentSize; // The number of occupied cells
/*** Abstract method that performs collision resolution.* Each class must override this method only.*/
protected abstract int findPos(Hashable x);
public ProbingHashTable(){allocateArray(DEFAULT TABLE SIZE);makeEmpty();
}
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Implementacao de Tabela de Dispersao
public final void insert(Hashable x){int currentPos = findPos(x);array[currentPos] = new HashEntry(x, true);if(++currentSize < array.length / 2)
return;// REHASHING CODE// Save old tableHashEntry [] oldArray = array;// Create a new double-sized, empty tableallocateArray(nextPrime(2 * oldArray.length));currentSize = 0;// Copy table overfor(int i = 0; i < oldArray.length; i++)
if(oldArray[ i ] != null && oldArray[ i ].isActive)insert(oldArray[ i ].element);
return;}
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Implementacao de Tabela de Dispersao
public final void remove(Hashable x) throws ItemNotFound{int currentPos = findPos(x);
assertFound(currentPos, ”ProbingHashTable remove”);array[currentPos].isActive = false;
}public final Hashable find(Hashable x) throws ItemNotFound{
int currentPos = findPos(x);
assertFound(currentPos, ”ProbingHashTable find”);return array[currentPos].element;
}private final void assertFound(int currentPos, String message)
throws ItemNotFound{if(array[currentPos] == null || !array[currentPos].isActive)
throw new ItemNotFound(message);}
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Implementacao de Tabela de Dispersao
public final void makeEmpty(){currentSize = 0;for(int i = 0; i < array.length; i++)
array[i] = null;}public final static int hash(String key, int tableSize){
int hashVal = 0;
for(int i = 0; i < key.length(); i++)hashVal = 37 * hashVal + key.charAt(i);
hashVal %= tableSize;if(hashVal < 0)
hashVal += tableSize;return hashVal;
}}
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Dispersao com teste quadratico
public class QuadraticProbingTable extends ProbingHashTable{protected final int findPos(Hashable x){
int collisionNum = 0;int currentPos = x.hash(array.length);
while(array[currentPos] != null &&!array[ currentPos ].element.equals(x)){
currentPos += 2 * ++collisionNum - 1; // Compute ith probeif(currentPos >= array.length) // Implement the mod
currentPos -= array.length;}
return currentPos;}
Rui Camacho Estrutura de Dados e Algoritmos
Tabelas de dispersao
Dispersao com teste quadratico
public static void main(String [] args){HashTable H = new QuadraticProbingTable();
final int NUMS = 4000;final int GAP = 37;
System.out.println(”Checking... no moreoutput means success)”);
try{ ... }catch(Exceptions.ItemNotFound e){
System.out.println(e);}}try{
for(int i = GAP; i != 0; i = (i + GAP) % NUMS)H.insert(new MyInteger(i));
for(int i = 1; i < NUMS; i+= 2)H.remove(new MyInteger(i));
for(int i = 2; i < NUMS; i+=2)H.find(new MyInteger(i));
for(int i = 1; i < NUMS; i+=2){try{
System.out.println(”OOPS!!! ” +H.find(new MyInteger(i)));
}catch(Exceptions.ItemNotFound e){}
}}
Rui Camacho Estrutura de Dados e Algoritmos