1 de 48

Tabelas de espalhamento

(HASH)

2 de 48

Observação

Leiam o seguinte texto baseado no livro do Cormen. Estes slides tem como único objetivo auxiliar no entendimento destes conceitos. Não está completo.

3 de 48

Busca ?

Quais algoritmo e estruturas que vocês já conhecem ?

Quais as limitações ?

4 de 48

Alguns algoritmos ....

5 de 48

Pesquisa sequencial

6 de 48

Pesquisa binária

7 de 48

Pesquisa Sequencial

x

Pesquisa Binária

8 de 48

Estruturas ....

9 de 48

Estruturas ....

Arranjos (array ou vetor)

10 de 48

Estruturas ....

Arranjos (array ou vetor)

Listas encadeadas

11 de 48

Estruturas ....

Arranjos (array ou vetor)

Listas encadeadas

Árvores binárias e n-árias

12 de 48

Estruturas ....

Arranjos (array ou vetor)

Listas encadeadas

Árvores binárias e n-árias

X

X

13 de 48

Estruturas ....

Arranjos (array ou vetor)

Listas encadeadas

Árvores binárias e n-árias

X

X

O (1)

O (N)

O (logN)

14 de 48

Como aproveitar as características de acesso constante de uma estrutura de dados contigua (vetor ou arranjo) ?

Pense na matricula de vocês ? Posso usá-la diretamente como um indice de um vetor ? Como seria a complexidade de busca ? Quais problemas ?

15 de 48

Rafael

24452

15600

Tancredo

Para a turma SIF130-2012, teriamos algo assim:

struct aluno {

int mat; // 4 bytes = 4 bytes

char nome[81]; // 1 byte * 81 = 81 bytes

char email[41]; // 1 byte * 41 = 41 bytes

}; Total = 126 bytes

typedef struct aluno Aluno;

16 de 48

Rafael

24452

15600

Tancredo

Para a turma SIF130-2012, teriamos algo assim:

struct aluno {

int mat; // 4 bytes = 4 bytes

char nome[81]; // 1 byte * 81 = 81 bytes

char email[41]; // 1 byte * 41 = 41 bytes

}; Total = 126 bytes

typedef struct aluno Aluno;

Quanto estarei consumindo de memoria ?

17 de 48

E se a matricula fosse composta por mais digitos, por exemplo 8.

E se quisessemos indexar por outra informação, ao invés da matricula, por exemplo o nome.

18 de 48

Função

19 de 48

Que função simples eu posso usar para mapear a matricula para valores entre 0 a 100.

20 de 48

Método da divisão

h(k) = k mod m

21398

17328

21513

21613

21264

98

Para m igual a 100, concluam o mapeamento e me diz o que identificaram ?

21 de 48

Função sobrejetora

Pode ocorrer que mais de um "índice" seja mapeado para um único valor.

Neste caso dizemos que ocorreu uma "colisão".

22 de 48

Função hash

Colisão

23 de 48

Funçao hash

Função hash é como uma função qualquer, porém o grande desafio é gerar funções onde ocorra poucas colisões.

Em rede e sistemas operacionais vocês verão alguns algoritmos, como o md5 e sha-1.

Como vocês acham que funciona a autenticação em um sistem unix ?

24 de 48

Tabelas de espalhamento (hash)

  • Hash é uma generalização da noção mais simples de um arranjo comum, sendo uma estrutura de dados do tipo dicionário.
  • Dicionários são estruturas especializadas em prover as operações de inserir, pesquisar e remover.
  • A idéia central do Hash é utilizar uma função, aplicada sobre parte da informação (chave), para retornar o índice onde a informação deve ou deveria estar armazenada.
  • Esta função que mapeia a chave para um índice de um arranjo é chamada de Função de Hashing.
  • A estrutura de dados Hash é comumente chamada de Tabela Hash.

25 de 48

DEFINIÇÃO DE HASH

Função de

Hashing

123.456.781-00

143.576.342-23

345.365.768-93

879.094.345-45

19

19

123.456.781-00; Fausto Silva; Av. Canal. Nº 45.

...

37

143.576.342-23; Carla Perez; Rua Celso Oliva. Nº 27.

...

50

345.365.768-93; Gugu Liberato; Av. Atlântica. S/N.

...

85

879.094.345-45 ; Hebe Camargo; Rua B. Nº 100.

...

37

50

85

20

Tabela Hash

26 de 48

Função hash

  • A Função de Hashing é a responsável por gerar um índice a partir de uma determinada chave.
  • O ideal é que a função forneça índices únicos para o conjunto das chaves de entrada possíveis.
  • A função de Hashing é extremamente importante, pois ela é responsável por distribuir as informações pela Tabela Hash.
  • A implementação da função de Hashing tem influência direta na eficiência das operações sobre o Hash.
  • Tal função deve ser fácil de se computar

27 de 48

Função hash

28 de 48

Função hash

Considerem uma função hash que mapeia todos os valores para o mesmo indice. Qual será a complexidade de busca ?

Considerem uma função hash que mapeia apenas um valor para cada indice. Qual será a complexidade de busca?

29 de 48

Como representar ?

30 de 48

Como representar ?

Precisamos de uma função hash

31 de 48

Como representar ?

Precisamos de uma função hash

Precisamos de um arranjo (vetor)

32 de 48

Como representar ?

Precisamos de uma função hash

Precisamos de um arranjo (vetor)

Precisamos tratar as colisões

33 de 48

Tratando colisões

Endereçamento fechado

Endereçamento aberto

34 de 48

ENDEREÇAMENTO FECHADO

35 de 48

ENDEREÇAMENTO FECHADO

No endereçamento fechado, a posição de inserção não muda. Todos devem ser inseridos na mesma posição, através de uma lista ligada em cada uma.

0

1

2

3

4

20 mod 5 = 0

20

18 mod 5 = 3

18

25 mod 5 = 0�colisão com 20

25

36 de 48

ENDEREÇAMENTO FECHADO

A busca é feita do mesmo modo: calcula-se o valor da função hash para a chave, e a busca é feita na lista correspondente.

Se o tamanho das listas variar muito, a busca pode se tornar ineficiente, pois a busca nas listas se torna seqüencial

0

1

2

3

20

4

0

88

32

15

11

60

37 de 48

ENDEREÇAMENTO FECHADO

A função HASH deve distribuir as chaves entre as posições de maneira uniforme

0

0

1

2

3

4

5

6

15

10

31

4

88

13

20

38 de 48

Endereçamento fechado - Operações

Chained-Hash-Search(T,k)

procure um elemento com chave k na lista T[h(k)] e devolva seu ponteiro

Chained-Hash-Insert(T,x)

insira x na cabeça da lista T[h(key[x])]

Chained-Hash-Delete(T,x)

remova x da lista T[h(key[x])]

39 de 48

40 de 48

Endereçamento aberto

No enderecamento aberto, todos os elementos são armazenados na

propria tabela hash.

Para realizar uma inserção, examinamos/testamos sucessivamente a

tabela hash ate que encontrarmos um slot vazio no qual a chave sera

inserida.

Em enderecamento aberto, a tabela hash pode encher, de forma que

nao seja mais possvel inserir elementos.

41 de 48

Endereçamento aberto - Inserção

9

0

1

Valores: 204, 44, 58, 10, 100, 25, 20

42 de 48

Endereçamento aberto - Inserção

9

204

0

1

Valores: 204, 44, 58, 10, 100, 25, 20

43 de 48

Endereçamento aberto - Inserção

44

9

204

0

1

Valores: 204, 44, 58, 10, 100, 25, 20

44 de 48

Endereçamento aberto - Inserção

44

9

204

0

1

Valores: 204, 44, 58, 10, 100, 25, 20

Terminem de completar ....

45 de 48

Endereçamento aberto

Algoritmo de inserção

  • Usa a função hash para calcular o endereço
  • Caso esteja ocupado, procure um local vazio.
  • Se der uma volta completa, significa que esta cheia

Algoritmo de busca

  • Usa a função hash para calcular o endereço
  • Enquanto nao achar o valor procurado e nem um espaço vazio.
  • Se der uma volta completa, significa que o valor não está lá.

46 de 48

Endereçamento aberto

Algoritmo de inserção

  • Usa a função hash para calcular o endereço
  • Caso esteja ocupado, procure um local vazio.
  • Se der uma volta completa, significa que esta cheia

Algoritmo de busca

  • Usa a função hash para calcular o endereço
  • Enquanto nao achar o valor procurado e nem um espaço vazio.
  • Se der uma volta completa, significa que o valor não está lá.

Quais conclusões que são possíveis tirar ?

47 de 48

Endereçamento aberto

A tabela tem que ser tratada de modo circular, quando chega no fim da tabela a varredura reinicia na posição 0.

Quanto mais "cheia" a tabela estiver, pior será a eficiência.

48 de 48