• Nenhum resultado encontrado

Tabelas de Dispersão. Algoritmos e Estruturas de Dados Verão Cátia Vaz 1

N/A
N/A
Protected

Academic year: 2021

Share "Tabelas de Dispersão. Algoritmos e Estruturas de Dados Verão Cátia Vaz 1"

Copied!
27
0
0

Texto

(1)

Tabelas de Dispersão

Algoritmos e Estruturas de Dados Verão 2012

(2)

Tabelas de endereçamento directo

n 

Endereçamento directo é usado quando o

universo de chaves é pequeno e todas as chaves

são distintas:

n  Cada posição k, contêm (referência) o elemento com

(3)

Tabelas de endereçamento directo:

desvantagens

n  Se o universo U é muito grande, armazenar uma tabela T

de tamanho |U| é impraticável.

n  O conjunto K de chaves que de facto foi armazenado pode

ser tão pequeno relativamente à dimensão do universo U que a maior parte do espaço alocado para T está a ser desperdiçado.

n  Alternativa: tabelas de dispersão.

n  Embora procurar por um elemento numa tabela de

dispersão possa demorar o mesmo do que procurar um elemento numa lista ligada ( Θ(N) no pior caso ), sob certas condições, o tempo expectável para procurar por um elemento numa tabela de dispersão é O(1).

(4)

Tabelas de Dispersão

n 

As tabelas de dispersão (

hash tables

) são

estruturas de dados que associam chaves a valores.

n  Cada chave é transformada pela função de dispersão

num número que é utilizado para indexar num array para encontrar os valores associados aquela chave.

n 

As tabelas de dispersão utilizam

:

n  tabela base de indexação;

n  funções de dispersão (hash functions);

(5)

Tabela Base

n 

Dispersão com índices livres:

n  Quando o número de elementos pode

ser estimado à partida em N

n  Tabela de M elementos (M > N)

n 

Dispersão por separação em

listas:

n  Quando o número de elementos a

guardar (N) é desconhecido

n  Tabela de M listas de elementos

(M < N) 0 M-1 0 M-1 ... ... ... ... ... ...

(6)

Função de Dispersão

n 

Uma

função de dispersão

:

n  Transforma a chave num inteiro [0;M-1] (M tamanho do

array);

n  Deve distribuir as chaves de forma uniforme e quase

aleatória;

n  Deve ser rápida de calcular;

n  Diferentes funções devem ser usadas para diferentes tipos

de dados.

n 

Definição:

Colisão

- ocorre quando a função de

dispersão devolve o mesmo valor para chaves

distintas

n 

Definição:

Função

de dispersão ideal

- a

probabilidade de ocorrer uma colisão para duas

chaves distintas é 1/M

.

(7)

Função de Dispersão

n 

A função de dispersão mais usada é a

divisão

:

n 

Chaves pequenas (representáveis por uma palavra

de memória):

n  tratar as chaves como inteiros (k)

n  h(k) = k % M

(8)

Função de Dispersão

Chave k k%1000 k%1024 k%1021 32699 699 955 027 15114 114 778 820 41502 502 542 662 30444 444 748 835 81699 699 803 019 30651 651 955 021 23670 670 118 187 12219 219 955 988 75745 745 993 191

(9)

Função de Dispersão

n  Chaves longas (String)

n  usar cada caracter como um inteiro (valor da representação

ASCII)

n  h(k) = k % M

n  dar um peso a cada caracter correspondente à sua posição na

cadeia

n  usar um número primo para o tamanho da tabela

static int hash(String s, int M){ int h=0; a=127;

for(int i=0;i<s.length();i++){ h=(a*h + s.charAt(i))%M;

}

(10)

Resolução de Colisões

n 

Para uma tabela de tamanho M, quantas inserções

podem ser feitas até à primeira colisão?

n Os algoritmos de resolução de colisões depende do tipo de tabela base

(11)

Resolução de colisões

n 

Algoritmos de resolução de colisões:

n 

Dispersão com separação em listas

, denominado

encadeamento externo

(

Separate Chaining

).

n 

Dispersão com índices livres

, denominado

encadeamento interno

(

Open Addressing

):

n  Procura Linear (Linear Probing);

n  Procura Quadrática (Quadratic Probing);

(12)

Resolução de Colisões:

Encadeamento Externo (

Separate Chaining)

n  Cada posição da tabela tem uma referência para uma lista

n  Colisões são resolvidas adicionando o elemento ao início da

lista

n  Remoções são resolvidas removendo o elemento da lista

Ordem de inserção: 70, 72, 14, 77, 19, 75 hash(k) = k mod 7 72 19 75 70 14 77

(13)

Resolução de colisões:

(14)

Resolução de colisões:

Encadeamento Externo (

Separate Chaining)

public interface HashFunction<E> { int hashCode(E e);

boolean equals(E e1, E e2);}

/*Função Hash por omissão*/

public class HashDefaultFunction implements HashFunction<Object> { private static HashFunction<Object> instance = null;

public static HashFunction<Object> getDefaultInstance(){ if(instance == null) instance = new HashDefaultFunction(); return (HashFunction<Object>)instance;}

public int hashCode(Object o){ return o.hashCode(); } public boolean equals(Object o1, Object o2){

return o1 == null ? o2 == null : o1.equals(o2);}

(15)

Resolução de colisões:

Encadeamento Externo (

Separate Chaining)

public class ChainingHashTable<E> { static class Node<T>{

T value; Node<T> next; Node(T v){ value = v;} } Node<E>[] v; int m; HashFunction<E> ho;

public ChainingHashTable(int len){

this(len,(HashFunction<E>)HashDefaultFunction.getDefaultInstance());}

public ChainingHashTable(int len, HashFunction<E> ho){ v = (Node<E>[]) new Node[len];

(16)

Resolução de colisões:

Encadeamento Externo (

Separate Chaining)

public class ChainingHashTable<E> { //(...)

private final int index(E e){ int h=ho.hashCode(e)% m; return (h<0)?h+m:h;}

public final void insert(E e){ int i = index(e);

Node<E> n = new Node<E>(e); n.next = v[i];

v[i] = n;}

//(...)}

public class ChainingHashTable<E> { //(...)

public final E search(E key){ int i = index(key);

Node<E> curr = v[i]; while(curr != null){ if(ho.equals(key,curr.value)) return curr.value; curr = curr.next; } return null; } //(...)}

(17)

Resolução de colisões:

Encadeamento Externo (

Separate Chaining)

public class ChainingHashTable<E> { //(...)

public final boolean delete(E e){ int i = index(e);

Node<E> curr = v[i]; Node<E> prev = null; while(curr != null){

if(ho.equals(curr.value,e)){

if(prev == null){ v[i] = v[i].next;} else{ prev.next = curr.next; }

return true; }

prev = curr; curr = curr.next; }

(18)

Encadeamento Externo (

Separate

Chaining): análise

n 

Pior Caso

do Encadeamento Externo: todas as N

chaves têm o mesmo hash, criando uma lista de

comprimento N.

θ

(N).

n 

Caso Médio

. A performance da dispersão depende de

como a função de dispersão distribui as chaves a

serem armazenadas pelas M posições.

n  Para o análise do caso médio assume-se o princípio de

dispersão uniforme simples. O algoritmo de procura é:

n  θ(1 + N/M).

(19)

Resolução de colisões:

Encadeamento interno (

Open Addressing

)

Inserção:

examinar

(probe) sucessivamente

a tabela de dispersão

até encontrar uma

posição vazia. A

sequência de posições

examinadas dependente

da chave a ser inserida.

A função de dispersão

inclui o número de vezes

que a tabela foi

examinada para aquela

chave

(20)

Resolução de colisões:

Encadeamento interno (

Open Addressing

)

Procura:

examinar a

mesma sequência de

posições que o algoritmo

de inserção examinou

para uma dada chave. A

procura termina ou

quando: ou encontra a

chave; ou examinou M

posições; ou encontra

um espaço livre.

(21)

Resolução de colisões:

Encadeamento interno (

Open Addressing

)

Eliminação.

n 

Não se pode colocar simplesmente a null na

posição da chave a ser eliminada.

n 

algoritmo de procura inconsistente.

n 

Uma solução será colocar a posição da chave a

ser eliminada com um valor especial ao invés

de ser eliminada.

n 

implica modificação do algoritmo inserção

(22)

Algoritmos de resolução de colisões

Encadeamento interno

(

Open Addressing

)

n 

Procura Linear (

Linear Probing

);

n 

Procura Quadrática (

Quadratic Probing

);

n 

Dupla Dispersão (

Double Hashing

).

(23)

Resolução de Colisões:

Encadeamento Interno-Procura Linear

n 

N < M : método com índices livres.

n  Dado que há sempre posições livres na tabela, procurar

outra posição.

n 

Procura linear:

n  se a posição correspondente ao índice devolvido pela

função de dispersão estiver ocupada, ir incrementando o índice até se encontrar uma posição livre.

70 14 72 77 0 1 2 3 4 Ordem de inserção: 70, 72, 14, 77, 19, 75 hash(k) = k mod 7

(24)

Resolução de Colisões

Procura Linear

(Linear Probing)

n 

Desempenho:

n  os elementos tendem a ficar agrupados (clusters);

n  os agrupamentos grandes tendem a crescer ainda mais;

n  o tempo médio de procura tende a crescer para M à

medida que a tabela enche;

n  operações na tabela de dispersão tornam-se demasiado

lentas quando a tabela atinge 70% - 80% da sua capacidade.

(25)

Resolução de Colisões

Procura Quadrática (

Quadratic Probing)

n 

Desempenho:

n 

tem melhores resultados que a procura linear;

n 

A função de

hash

inicial define a sequência;

n 

elementos que têm a mesma função de

hash

têm

a mesma sequência logo também tendem a ficar

agrupados (

secondary

clusters

);

n 

Em caso de colisão, existem m sequências de

(26)

Resolução de Colisões

(27)

Resolução de Colisões

Dupla Dispersão (

Double Hashing

)

n 

Desempenho:

n  é um dos melhores métodos de resolução;

n  a sequência também depende da chave;

n  elementos que têm a mesma função de hash têm sequências

distintas

n  Em caso de colisão, existem m2 sequências de exame (probe)

diferentes

n  cada par possível (h1(k),h2(k)) assegura uma sequência de

examinação diferente.

n  Tem que se garantir que a tabela é pesquisada na totalidade:

n  Usando um m que seja potencia de dois e desenhando h2(k) para produzir

Referências

Documentos relacionados

Note on the occurrence of the crebeater seal, Lobodon carcinophagus (Hombron &amp; Jacquinot, 1842) (Mammalia: Pinnipedia), in Rio de Janeiro State, Brazil.. On May 12, 2003,

Anne Teresa De Keersmaeker e Jean-Guihen Queyras (o violoncelista que vai acompanhar ao vivo os bailarinos, tocando as suites de seguida, em tours de force de mais de duas

Participação do setor na arrecadação do tributo é de apenas 0,11% Participação do setor na arrecadação do tributo é de apenas 0,11% Participação do setor na arrecadação

d) A CONTRATADA se obriga a manter a CONTRATANTE livre e a salvo de quaisquer queixas, reivindicações, reclamações, ações judiciais, reclamações trabalhistas,

Corograpliiu, Col de Estados de Geografia Humana e Regional; Instituto de A lta C ultura; Centro da Estudos Geográficos da Faculdade de Letras de Lisboa.. RODRIGUES,

Conclui-se, portanto, que o processo de implementação da nova organização curricular, que traz o Trabalho de Conclusão de Curso como requisito obrigatório para obtenção do

Com base nos resultados da pesquisa referente à questão sobre a internacionalização de processos de negócios habilitados pela TI com o apoio do BPM para a geração de ganhos para

Também nós, possamos reconhecer naqueles que são acolhidos, os Amigos e Mensageiros da Vossa presença,. Que Vós, sem cessar, enviais