22
Tabelas de dispers˜ ao Tabelas de Dispers˜ ao Rui Camacho Estrutura de Dados e Algoritmos

Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

Tabelas de dispersao

Tabelas de Dispersao

Rui Camacho Estrutura de Dados e Algoritmos

Page 2: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 3: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 4: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 5: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 6: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 7: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 8: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 9: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 10: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 11: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 12: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 13: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 14: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 15: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 16: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 17: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 18: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 19: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 20: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 21: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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

Page 22: Tabelas de Dispers~aorcamacho/cadeiras/bioinform... · Tabelas de dispers~ao Tabela de Dispers~ao I items de informa˘c~ao guardados num vector[Tamanho] I cada chave e mapeada num

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