• Nenhum resultado encontrado

E STRUTURAS DED ADOSE A LGORITMOS T

N/A
N/A
Protected

Academic year: 2019

Share "E STRUTURAS DED ADOSE A LGORITMOS T"

Copied!
33
0
0

Texto

(1)

E

STRUTURASDE

D

ADOS E

A

LGORITMOS

T

ABELA

H

ASH

Adalberto Cajueiro

Departamento de Sistemas e Computação Universidade Federal de Campina Grande

1

E

STRUTURAS VISTAS ATÉ AGORA

 Estruturas lineares: vetor, fila, lista e pilha

 Ordenadas ou não

 Árvores Binárias de Pesquisa

 Ordenadas  Heaps Binárias

 Chaves com certa ordem

 Todas são estruturas de busca e levam tempo até encontrar o elemento desejado

2 8

2 6 1

9 5 2 6 1 7 8 4 9

(2)

2

E

STRUTURAS VISTAS ATÉ AGORA

 Estruturas lineares: vetor, fila, lista e pilha

 Ordenadas ou não

 Árvores Binárias de Pesquisa

 Ordenadas  Heaps Binárias

 Chaves com certa ordem

 Todas são estruturas de busca e levam tempo até encontrar o elemento desejado

3 8

2 6

4

1

9 5 2 6 1 7 8 4 9

5 2 6 1 4

Será que existe alguma forma de estruturar os dados para que as pesquisas sejam O(1)?

P

ROBLEMA

 Cenário:

 Suponha que desejamos ter inserção, remoção, pesquisa em O(1) para um sistema que gerencie os N

discentes e docentes do DSC/UFCG? Assuma que cada pessoa possui um número identificador único no intervalo [1..N].

 Que estrutura de dados vocês escolheriam?

(3)

Admitindo que K é relativamente pequeno

5

T

ABELA DE

A

CESSO

D

IRETO

 Poucos elementos

 Seja k ∈ U = {0,1,2...,m-1}

 Todas as chaves da tabelas são distintas  Criar Array A

 A[0..m-1]

 A[k] = x,

se k = key[x] ou A[k] = null

6 1 3 4 6 7 8 0 / / / / / / / key=2 João key=9 Leila key=5 Maria 2 5 9 Chaves (K)

h(k) = k Acesso

(4)

4

T

ABELA DE

A

CESSO

D

IRETO

 Operações (inserir, remover, pesquisar) utilizando a tabela de acesso direto.

7

Direct-Address-Search(T, k)

return T[k]

Direct-Address-Insert(T, x)

T[key[x]] ← x

Direct-Address-Delete(T, x)

T[key[x]] ← NIL

T

ABELA DE

A

CESSO

D

IRETO

(P

ROBLEMAS

)

O que acontece se U for muito grande? E se K for muito pequeno em relacao a U?

O que acontece quando |U| é muito maior que length(T)?

(5)

 Também conhecidas com o tabelas de dispersão

 Resolve o problema quando |U| > length(T) mantendo o tempo de acesso em O(1) em média?

 Nao usa a identidade para mapear chaves em indices mas uma funcao de hashing.

 Se |U| > length(T) pelo menos duas chaves são mapeadas para o mesmo índice (colisão)

 É impossível não ter colisões

 Elas devem ser minimizadas 9

}

1

,...,

0

{

:

U

m

h

T

ABELA

H

ASH

 Exemplo de colisão

10

(6)

6

C

ARACTERÍSTICAS

 Não precisamos ocupar |U| posições na tabela

 Ocupamos menos espaço do que com a tabela de acesso direto

 Espaco: O(|K|), onde K é o conjunto de chaves guardadas

 Dá para conseguir acesso com tempo O(1) na média

 O elemento com chave k é guardado na posição h(k) da tabela

 h é a função hash

 h tem que ser determinística

11

E

XEMPLO

 Seja h(k)=k%10 uma função hash que mapeia de chaves do universo K em {2,5,9,100,107}.

Considere uma tabela com m=10 células.

(7)

 O que acontece se utilizarmos a função hash h(k)=k%10 para inserir os elementos {2,5,9,12}?

13

/ /

/ /

/ / / Universo de

Chaves (U) 2

...

9 ... 5

...

2

5

9

12

C

OLISÕES

 Tabela hash ideal seria aquela sem colisão

 Impossível quando |U| > m (tamanho da tabela)  Existem mais chaves que posições

 Duas ou mais chaves são mapeadas em um mesmo índice

 Escolher uma boa função hash para minimizar as colisões

(8)

8

R

ESOLUÇÃO DE

C

OLISÕES

(A

BORDAGENS

)

Endereçamento fechado

 Elementos com mesmo código hash são colocados na

mesma posição da tabela (chaining)

Na verdade, inseridos na cabeça da lista já que existe a idéia que o o elemento inserido será usado em breve

Endereçamento aberto

 Chaves com mesmo código hash são colocadas em

posições diferentes

15

E

NDEREÇAMENTO

F

ECHADO

: C

HAINING

 Usar uma lista encadeada

(9)

 Implemente as operações (inserir, remover, pesquisar) utilizando a resolução de conflitos by chaining?

 Inserir(T,x)

 Remover(T,x)

 Pesquisar(T,k)

17

E

XERCÍCIO

 Implemente as operações (inserir, remover, pesquisar) utilizando a resolução de conflitos by chaining?

 Inserir(T,x)

Inserir x na cabeça de T[h(key(x))];

 Remover(T,x)

Deletar x da lista T[h(key(x))];

 Pesquisar(T,k)

Buscar x na lista T[h(k)];

(10)

10

E

XERCÍCIO

 Implemente as operações (inserir, remover, pesquisar) utilizando a resolução de conflitos by chaining?

 Inserir(T,x)

Inserir x na cabeça de T[h(key(x))];

 Remover(T,x)

Deletar x da lista T[h(key(x))];

 Pesquisar(T,k)

Buscar x na lista T[h(k)];

19 Faça a análise do pior caso das operações (inserir, remover, pesquisar)

E

XERCÍCIO

 Qual seria a tabela final considerando

endereçamento fechado (resolução por chaining) e função de hash h(k)=k%2 e chaves do universo K={2,4,6,8}?

(11)

 Qual seria a tabela final considerando

endereçamento fechado (resolução por chaining) e função de hash h(k)=k%2 e chaves do universo K={2,4,6,8}?

21

/

8 ...

2 4

6

6 ...

4 ...

2 ...

8

F

ATOR DE

C

ARGA

 A função h faz um hashing uniforme simples

 Chaves possuem igual probabilidade de serem mapeadas para qualquer um dos indices

 Cada célula da tabela vai ter um número mais ou menos igual de elementos

 Origina a noção de load factor (fator de carga) α (numero medio de elementos em cada lista)

 n = número de chaves

 m = número de células na tabela

 α = n/m

 Exemplo: qual o fator de carga de uma tabela

(12)

12

E

XERCÍCIO

 Qual o limite assintoticamente restrito usando o fator de carga (α) para uma pesquisa?

23 ... ... h(ki) ... h(kj) ... h(kn) ... ... T i

Θ

(1+

α

)

Aplicar a função hash

E

XERCÍCIO

 Quando uma pesquisa será feita em Θ(1)?

 α = n/m = O(1)

 n = O(m)

24 ... ... h(ki) ... h(kj) ... h(kn) ... ... T i

(13)

 Vamos utilizar a função hash h(k) = k%m (m=10) para guardar os RGs. Qual o último dígito do RG de vocês? Como vai ficar a tabela hash depois de inserirmos todos os RGs de vocês?

 Será que tem alguma função hash melhor?

25

E

XERCÍCIO

 Vamos utilizar a função hash h(k) = k%m (m=10) para guardar os RGs. Qual o último dígito do RG de vocês? Como vai ficar a tabela hash depois de inserirmos todos os RGs de vocês?

 Será que tem alguma função hash melhor?

Como escolher uma função hash?

(14)

14

C

ARACTERÍSTICAS DA

F

UNÇÃO

H

ASHING

 Minimizar o número de colisões

 Satisfazer a hipótese de hashing uniforme

 Qualquer chave tem a mesma probabilidade de ser mapeada em qualquer um dos m slots. Mas é difícil

 Alguns métodos ajudam

 Divisão

 Multiplicação

 Consideramos as chaves como números

 Fácil de mapear Strings,... para números

27

M

ÉTODO DA

D

IVISÃO

 Usa o resto da divisão para encotrar valores hash

 Neste método a função hash é da forma:

 Método rápido (requer apenas uma divisao)

28

(15)

 Seja K = {2,4,12,10,5}, desenhe a tabela final considerando as seguintes funções hash (utilize a resolução de conflitos por chaining). As tabelas possuem 2, 5 e 10 células

 h=k mod 2

 h=k mod 5

 h=k mod 10

29

M

ÉTODO DA

D

IVISÃO

 O método da divisão garantes boas funcoes de hashing?

 O que basicamente muda entras as funções hash no método da divisão?

 Que valores escolhemos para m?

(16)

16

M

ÉTODO DA

D

IVISÃO

 O método da divisão garantes boas funcoes de hashing?

 O que basicamente muda entras as funções hash no método da divisão?

 Qual(is) valor(es) escolhemos para m?

 Não escolha um m tal que tenha um divisor d bem pequeno

 Não escolha m = 2r,

 Escolha m sendo um número primo que não seja próximo das potências de 2 ou 10

31

E

XERCÍCIO

 Suponha as chaves {200, 205, 210, 215, 220, ..., 595}.

 Se eu escolher a função h(k) = k %100. Vai existir colisão em alguma célula? Se sim, quantas?

 Se eu escolher a função h(k) = k %101. Vai existir colisão? Se sim, quantas?

(17)

 Suponha as chaves {200, 205, 210, 215, 220, ..., 595}.

 Se eu escolher a função h(k) = k %100. Vai existir colisão em alguma célula? Se sim, quantas?

Cada célula preenchida terá quatro chaves

 Se eu escolher a função h(k) = k %101. Vai existir colisão? Se sim, quantas?

Cada célula preenchida terá uma chave

33

0 ... 5 ... 10 ...

200, 300, 400, 500

205, 305, 405, 505

210, 310, 410, 510

101 202 303 404 505

200 205 210 215 220, ... , 295, 300

099 003 008 013 018, ... , 093, 098

305 310 315 320 325, ... , 395, 400

002 007 012 017 023, ... , 092, 097

A

PPLET

 http://www.cse.yorku.ca/~aaw/Hang/hash/Hash.h tml

 http://www.engin.umd.umich.edu/CIS/course.des/ cis350/hashing/WEB/HashApplet.htm

(18)

18

M

ÉTODO DA

M

ULTIPLICAÇÃO

 Neste método a função hash é da forma:

 k é a chave

 A é uma constante entre (0..1)

Um bom valor é

 m (número de células) geralmente é 2p, onde p é inteiro  O valor de m não é crítico como no método da

divisão

 Um pouco mais lento do que o da divisão

35

h(k) =

m (k.A mod 1)

Extrai a parte fracionária de k.A

... 6180339887 . 0 2 / ) 1 5 (    A

E

XERCÍCIO

 Calcule o codigo hash h = ⌊m (kA mod 1)⌋ das chaves ({2, 3, 4, 5, 6, 10, 15}), onde A = 0.2 e m = 1000

36

(19)

 Até agora vimos a resolução de conflitos por chaining (Endereçamento Fechado)

 Precisa de uma estrutura de dados auxiliar (lista)  E se não tivermos listas para resolver as colisões?

 Precisamos de um número m bem maior de células.

 Chaves que colidam precisam ter seu hash code “recalculado” para encontrar um slot vazio

Todas as chaves estão em alguma célula. Cada entrada da tabela ou contem um elemento ou NIL

37

O

UTRA

F

ORMA DE

R

ESOLVER

C

ONFLITOS

 Endereçamento aberto faz uso de um probe.

 Examina a tabela (sequencial ou nao) até encontrar um slot vazio.

 A sequencia de posicoes sendo examinadas dependem da chave

 Função hash é estendida

 posicao = h(k,p)

 k = chave

(20)

20

E

XEMPLO

: I

NSERÇÃO

 Insira a chave k=100

 Probe h(100,0)

 Probe h(100,1)

 Probe h(100,2)

39

200

/ /

150

/ /

/

999 / /

100

A

LGORITMO

: I

NSERÇÃO

(21)

 Pesquisa a chave k=100

 Probe h(100,0)

 Probe h(100,1)

 Probe h(100,2)

41

200

/ /

150

/ /

/

999

/ /

A

LGORITMO

: P

ESQUISA

(22)

22

E

NDEREÇAMENTO

A

BERTO

(D

ELEÇÃO

)

 Como fazer uma remocao com enderecamento aberto?

 Podemos atribuir NIL diretamente na posição da chave a ser removida?

43

E

NDEREÇAMENTO

A

BERTO

(D

ELEÇÃO

)

 Como fazer uma remocao com enderecamento aberto?

 Nao podemos simplesmente dizer que o slot esvaziou colocando NIL

 Usar uma flag (valor especial DELETED) ao invés de NIL

 Alterar as funções

Inserir (inserir no flag se ele for DELETED)

Pesquisar (continuar a pesquisa no flag ao invés de NIL)

(23)

 Remova a chave k=100

 Probe h(100,0)

 Probe h(100,1)

 Probe h(100,2)

 Pesquisar até achar a chave (remova – coloque um flag DELETED) ou uma célula vazia

45

200

/ 100

150

/ /

/

999 / /

X E como ficaria a inserção?

E

XEMPLO

46

(24)

24

H

ASHING COM

P

ROBING

 Como escolher a função hash no endereçamento aberto usando o probe?

 Por que não utilizar a função h(k,i) = k%m?

 Precisamos usar i para que o endereço mude.  Tres técnicas são usadas para computar as

sequencias de probes

 Linear Probing

 Quadratic Probing

 Double Hashing

47

L

INEAR

P

ROBING

 Dada uma funcao de hash ordinaria (obtida por divisão ou multiplicação) o método usa a função de hash da forma:

 Slots buscados linearmente

 Facil de implementar mas apresenta problemas

Clustering Primário – clusters podem surgir quando slots

ocupados se agrupam. Isso aumenta o tempo da busca. 48

} 1 ,..., 1 , 0 { :

' Um

h

m

i

k

h

i

k

h

(

,

)

(

'

(

)

)

mod

(25)

 Seja m=10, h(k) = k mod 5. Utilize o probing linear para inserir os valores ({10,15,2,12,4,8})

49

h(k,i) = (k mod 5 + i) mod 10

P

ROBING

Q

UADRÁTICO

Neste método a função hash é da forma:

 c1 e c2 são constantes

 Primeiro elemento buscado T[h’(k)]. Demais variam com funcao quadratica de i.

Evita o clustering primário

Pode ocorrer um Clustering Secundário – duas chaves com mesmo probe inicial geram mesma sequencia de probes

 Mas é melhor do que o anterior 50

Método da Divisão ou Multiplicação

m

i

c

i

c

k

h

i

k

h

(

,

)

(

'

(

)

2

)

mod

2 1

(26)

26

E

XERCÍCIO

 Seja m=10, c1=3, c2=5, h(k) = k mod 5. Utilize o probing quadrático para inserir os valores ({10,15,2,12,4,8}):

51

h(k,i) = (k mod 5 + 3i + 5i

2

) mod 10

E

XERCÍCIO

 Compare a resposta anterior com o linear probing e o endereçamento fechado (h(k) = k mod 10) com chaining para inserir os valores ({10,15,2,12,4,8}):

52

h(k) = k mod 10

(27)

 Um dos melhores metodos para endereçamento aberto

 Neste método a função hash é da forma:

 A sequencia de probe depende de duas formas em k.

 Dicas

Faça h2(k) retornar um número ímpar e m ser um número 2p Faça m ser um numero primo e h2(k) retornar um inteiro

positivo menor que m

 Excelentes resultados

 Produz Θ(m) sequências (se aproxima mais do hashing

uniforme simples) 53

Método da Divisão ou Multiplicação

m

k

h

i

k

h

i

k

h

(

,

)

(

(

)

.

(

))

mod

2

1

E

XERCÍCIO

 Seja m=24, h1(k) = k mod 5 e h2(k) = k+1 mod 7. Utilize o hashing duplo para inserir os valores ({10,15,2,12,4,8}):

54

(28)

28

POSCOMP 2009

55

F

ATOR DE

C

ARGA

 Qual o fator de carga no endereçamento aberto?

 O load factor é ≤1

 Por que?

(29)

 O que fazer quando o vetor interno da tabela hash ficar cheio?

Duplicar quando estiver cheio?

 Duplicar quando atingir uma certa capacidade?

57

R

EHASHING

 Quando a capacidade preenchida (exceder 50%), as operações na tabela passam a demorar mais, pois o número de colisões aumenta

 Expandir o array que constitui a tabela, e reorganizar os elementos na nova tabela

 Novo tamanho: número primo próximo ao dobro da tabela atual

(30)

30

E

XEMPLO

59

Tamanho = 13

34 40 X 11 95

34

40 95 11

Tamanho = 7

Object put() { ...

if (++size > threshold) rehash(); ...

}

void rehash() { ...

newcapacity = prime number near 2*buckets; threshold = (int) (newcapacity * loadFactor); buckets = new HashEntry[newcapacity]; ... }

E

XERCÍCIO

 Quando devemos fazer o rehashing?

 No endereçamento aberto não conseguirmos mais inserir um elemento

 Quando metade da tabela estiver ocupada (limite de capacidade)

(31)

 Hashtable

 http://www.docjar.com/html/api/java/util/Hashtable.java .html

 Ver funções

 hash()

O código hash é delegado para cada classe

 containsKey()

 get()

 put()

 remove()

 rehash()

 equals( ) x hashCode( ).

 a.equals(b) ⇔ hashCode(a) = hashCode(b) 61

T

ABELA

H

ASH

(I

MPLEMENTAÇÃO

)

 Como seria representada uma tabela hash em Java?

62

public interface Hashtable<T> { public boolean isEmpty();

public boolean isFull(); public int capacity(); public int size();

(32)

32

T

ABELA

H

ASH

(I

MPLEMENTAÇÃO

)

 Separando a tabela de sua função hash?

63

Hashtable HashFunction

T

ABELA

H

ASH

(I

MPLEMENTAÇÃO

)

 Separando a tabela de sua função hash?

64

Hashtable HashFunction

HashFunctionClosedAddress int hash(Object element)

HashFunctionOpenAddress int hash(Object element, int probe)

HashFunctionDivision

HashFunctionMultiplication

HashFunctionLinearProbing

HashFunctionQuadraticProbing

(33)

 Separando a tabela de sua função hash?

65

Hashtable HashFunction

HashFunctionClosedAddress HashFunctionOpenAddress

HashFunctionDivision

HashFunctionMultiplication

HashFunctionLinearProbing

HashFunctionQuadraticProbing

HashFunctionDoubleHashing

HashtableClosedAddress HashtableOpenAddress

R

EFERÊNCIAS

 Capítulo 12

 1a edição  Capítulo 11

 2a edição

Referências

Documentos relacionados

Para a configuração proposta serão utilizadas duas VLANs, uma de dados para acesso aos serviços de Internet via PPPoE IPv4 (VID 701) e a outra para acesso

regulamentares ou regimentais do cargo, no caso de cargo técnico ou científico. 279 - Para os efeitos deste Capítulo, a expressão “cargo” compreende os cargos, funções ou empregos

Após 5 anos de tratamento com acetato de medroxiprogesterona injetável (150 mg IM), a alteração percentual média na densidade mineral óssea em relação aos valores basais foi

 Cada elemento (nó) da lista contém um dado armazenado e um apontador para o próximo elemento da lista?.  Estrutura recursiva com

 Para algumas aplicações, skip lists são mais naturais que árvore e levam a algoritmos mais simples e fáceis de implementar..  Performance melhorada por um fator constante em

 Alguns conjuntos dinamicos pressupoem que existe uma relação de ordem entre as chaves.. Isso permite falar do próximo elemento ao invés de um elemento

 A alocação dinâmica é muito utilizada em problemas de estrutura de dados como por exemplo, listas encadeadas, pilhas, filas, arvores binárias e grafos ...  O interessante

O DIRIGENTE DE EFPC DEVE DESENVOLVER ATITUDES PAUTADAS PELAS DIRETRIZES FIXADAS PELO CMN ATRAVÉS DE OBSERVÂNCIA DE PRINCÍPIOS DE SEGURANÇA, RENTABILIDADE, SOLVÊNCIA, LIQUIDEZ