46
Pesquisa em Memória Primária Prof. Jonas Potros

Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Embed Size (px)

Citation preview

Page 1: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Pesquisa em Memória Primária

Prof. Jonas Potros

Page 2: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Transformação de Chave (Hashing)

A transformação de chave difere-se dos métodos anteriores, porque osregistros são armazenados em uma tabela e são diretamenteendereçados a partir de uma transformação aritmética sobre a chavede pesquisa.

Um método de pesquisa com o uso da transformação de chave éconstituído de duas etapas principais:

1. Computar o valor da função de transformação ou função hashing, a qualtransforma a chave de pesquisa em um endereço da tabela.

2. Considerando que duas ou mais chaves podem ser transformadas em ummesmo endereço de tabela, é necessário existir um método para lidar comcolisões.

Page 3: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Transformação de Chave (Hashing)

Qualquer que seja a função de transformação, algumas colisões irãoocorrer fatalmente, e tais colisões têm de ser resolvidas de algumaforma.

Exemplo: Se por ventura as chaves fossem inteiras de 1 𝑎 𝑛, entãopoderíamos armazenar o registro com a chave 𝑖 na posição 𝑖 da tabela,e qualquer registro poderia ser imediatamente acessado e a partir dovalor da chave.

𝑏 = 0, 𝑙𝑜𝑔𝑜 𝐴[𝑏] = 0

A

[0] 0

[1] 1

[2] 2

Page 4: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Colisões

Vamos supor que uma tabela é capaz de armazenar 𝑀 = 97 chaves,em que cada chave pode ser um número decimal de quatro dígitos.Nesse caso, existe 𝑁 = 10.000 chaves possíveis, e a função detransformação não pode ser um para um, mesmo que o número deregistros a serem armazenados seja muito menor do que 97.

𝑏 = 0, 𝑙𝑜𝑔𝑜 𝐴[𝑏] ≠ 0

𝑥 = 1, 𝐴 1 = 2870, 𝑙𝑜𝑔𝑜 𝐴[𝑥] → 𝐴

A

[0] 1002

[1] 2870

[2] 8375

.... ....

[97] y

Qualquer que seja a função de transformação,algumas colisões irão ocorrer fatalmente, e taiscolisões têm de ser resolvidas de algumaforma.

Page 5: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Colisões

Vamos supor que uma tabela é capaz de armazenar 𝑀 = 97 chaves,em que cada chave pode ser um número decimal de quatro dígitos.Nesse caso, existe 𝑁 = 10.000 chaves possíveis, e a função detransformação não pode ser um para um, mesmo que o número deregistros a serem armazenados seja muito menor do que 97.

𝑏 = 0, 𝑙𝑜𝑔𝑜 𝐴[𝑏] ≠ 0

𝑥 = 1, 𝐴 1 = 2870, 𝑙𝑜𝑔𝑜 𝐴[𝑥] → 𝐴

A

[0] 1002

[1] 2870

[2] 8375

.... ....

[97] y

Mesmo que se obtenha uma função detransformação que distribua os registros deforma uniforme entre as entradas da tabela,existe uma alta probabilidade de havercolisões.

Page 6: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Funções de Transformação

Uma função de transformação deve mapear chaves em inteiros dentrodo intervalo [0. .𝑀 − 1], onde𝑀 é o tamanho da tabela.

A função de transformação ideal é aquela que:

1. Seja simples de ser computada.

2. Para cada chave de entrada, qualquer uma das saídas possíveis é igualmente provável de ocorrer.

Como as transformações sobre as chaves são aritméticas, deve-setransformar as chaves não-numéricas em números.

• Basta realizar uma conversão de cada caractere da chave não numérica paraum número inteiro.

Page 7: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Método mais usado

Usa o resto da divisão por M, onde K é um inteiro correspondente àchave:

ℎ(𝐾) = 𝐾 𝑚𝑜𝑑 𝑀

Cuidado na escolha do valor de M. M deve ser um número primo, masnão qualquer primo: devem ser evitados os números primos obtidos apartir de:

𝑏𝑖 ± 𝑗

onde 𝑏 é a base do conjunto de caracteres (geralmente 𝑏 = 64 paraBCD, 128 para ASCII, 256 para EBCDIC, ou 100 para alguns códigosdecimais), e 𝑖 e 𝑗 são pequenos inteiros.

Page 8: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Transformação de Chaves – não numéricas

As chaves não numéricas devem ser transformadas em números:

𝐾 =

𝑖=0

𝑛−1

𝑐ℎ𝑎𝑣𝑒 𝑖 × 𝑝[𝑖]

𝑛 é o número de caracteres da chave;

𝑐ℎ𝑎𝑣𝑒[𝑖] corresponde à representação ASCII ou Unicode do 𝑖 − é𝑠𝑖𝑚𝑜 caractere da chave;

𝑝[𝑖] é um inteiro de um conjunto de pesos gerados randomicamente para 0 ≤ 𝑖 ≤ 𝑛 − 1;

Vantagem de se usar pesos: Dois conjuntos diferentes de pesos 𝑝1[𝑖] e 𝑝2[𝑖], 0 ≤ 𝑖 ≤ 𝑛 − 1,

levam a duas funções de transformação ℎ1(𝐾) 𝑒 ℎ2(𝐾) diferentes;

Page 9: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Transformação de Chaves – não numéricas

Programa que gera um peso para cada caractere de uma chave constituída de n caracteres:

GeraPesos (int n) {

int p[n];

for (int i = 0; i < n; i ++) p[i] = random(M) + 1;

return p;

}

Page 10: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Transformação de Chaves – não numéricas

Implementação da função de transformação:

hashing (String chave, int[ ] pesos) {

int soma = 0;

for ( int i = 0; i < chave.length ( ) ; i++)

soma = soma + (chave(i)) ∗ pesos[ i ];

return soma mod M;

}

Page 11: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Listas Encadeadas

Uma das formas de resolver as colisões é simplesmente construir umalista linear encadeada para cada endereço da tabela.

• Assim, todas as chaves com mesmo endereço são encadeadas emuma lista linear.

Exemplo: Se a 𝑖 − é𝑠𝑖𝑚𝑎 letra do alfabeto é representada pelonúmero 𝑖 e a função de transformação:

ℎ(𝐶ℎ𝑎𝑣𝑒) = 𝐶ℎ𝑎𝑣𝑒 𝑚𝑜𝑑 𝑀

Page 12: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

Page 13: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

ℎ 𝑃 = ℎ 2 = 2

P

Page 14: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5

Page 15: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5

Page 16: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5

S

Page 17: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3

S

Page 18: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3

S

Q

Page 19: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0

S

Q

Page 20: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0

S

Q

U

Page 21: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0ℎ 𝐼 = ℎ 23 = 2

S

Q

U

Page 22: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0ℎ 𝐼 = ℎ 23 = 2

S

Q

U

I

Page 23: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0ℎ 𝐼 = ℎ 23 = 2ℎ 𝑆 = ℎ 47 = 5

S

Q

U

I

Page 24: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0ℎ 𝐼 = ℎ 23 = 2ℎ 𝑆 = ℎ 47 = 5

S

Q

U

I

S

Page 25: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0ℎ 𝐼 = ℎ 23 = 2ℎ 𝑆 = ℎ 47 = 5ℎ 𝐴 = ℎ 1 = 1S

Q

U

I

S

Page 26: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E

ℎ 𝑃 = ℎ 2 = 2ℎ 𝐸 = ℎ 19 = 5ℎ 𝑆 = ℎ 5 = 5ℎ 𝑄 = ℎ 17 = 3ℎ 𝑈 = ℎ 7 = 0ℎ 𝐼 = ℎ 23 = 2ℎ 𝑆 = ℎ 47 = 5ℎ 𝐴 = ℎ 1 = 1S

Q

U

I

S

A

Page 27: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Exemplo: Listas Encadeadas

Inserção das chaves 𝑃 𝐸 𝑆 𝑄 𝑈 𝐼 𝑆 𝐴, sendo𝑀 = 7.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

P

E S

Q

U

I

S

A

nil

nil

nil

nil

nil

nil

nil

Page 28: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Quando o número de registros a serem armazenados na tabela puderser previamente estimado, então não haverá necessidade de usar listasencadeadas para armazenar os registros.

Existem vários métodos para armazenar 𝑁 registros em uma tabela detamanho 𝑀 > 𝑁, os quais utilizam os lugares vazios na própria tabelapara resolver as colisões.

No Endereçamento aberto todas as chaves são armazenadas naprópria tabela, sem o uso de listas encadeadas em cada entrada dela.

Page 29: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Existem várias propostas para a escolha de localizações alternativas. Amais simples é chamada de hashing linear, onde a posição ℎ𝑗 na tabelaé dada por:

ℎ𝑗 = (ℎ(𝑥) + 𝑗) 𝑚𝑜𝑑 𝑀, 𝑝𝑎𝑟𝑎 1 ≤ 𝑗 ≤ 𝑀 − 1.

Exemplo: Se a 𝑖 − é𝑠𝑖𝑚𝑎 letra do alfabeto é representada pelonúmero 𝑖 e a função de transformação:

ℎ(𝑐ℎ𝑎𝑣𝑒) = 𝑐ℎ𝑎𝑣𝑒 𝑚𝑜𝑑 𝑀

Page 30: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0]

[1]

[2]

[3]

[4]

[5]

[6]

ℎ(𝐿) = ℎ(19) = 5

Page 31: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0]

[1]

[2]

[3]

[4]

[5] L

[6]

ℎ(𝐿) = ℎ(19) = 5

Page 32: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0]

[1]

[2]

[3]

[4]

[5] L

[6]

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0

Page 33: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1]

[2]

[3]

[4]

[5] L

[6]

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0

Page 34: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1]

[2]

[3]

[4]

[5] L

[6]

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0

Page 35: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2]

[3]

[4]

[5] L

[6]

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0

Page 36: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2]

[3]

[4]

[5] L

[6]

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5

Page 37: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2]

[3]

[4]

[5] L

[6]

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5

Page 38: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2]

[3]

[4]

[5] L

[6] E

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5

Page 39: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2]

[3]

[4]

[5] L

[6] E

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5ℎ(𝐸) = ℎ(19) = 5

Page 40: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2]

[3]

[4]

[5] L

[6] E

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5ℎ(𝐸) = ℎ(19) = 5

Page 41: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2] S

[3]

[4]

[5] L

[6] E

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5ℎ(𝑆) = ℎ(19) = 5

Page 42: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2] E

[3]

[4]

[5] L

[6] E

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5ℎ(𝑆) = ℎ(19) = 5

Page 43: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Endereçamento Aberto

Inserção das chaves 𝐿 𝑈 𝑁 𝐸 𝑆 na tabela, usando hashing linear pararesolver colisões.

A

[0] U

[1] N

[2] E

[3]

[4]

[5] L

[6] E

ℎ 𝐿 = ℎ 19 = 5ℎ(𝑈) = ℎ(21) = 0ℎ(𝑁) = ℎ(14) = 0ℎ(𝐸) = ℎ(5) = 5ℎ(𝐸) = ℎ(19) = 5

Page 44: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Vantagens e Desvantagens

Vantagens:• Alta eficiência no custo de pesquisa, que é O(1) para o caso médio.

• Simplicidade de implementação.

Desvantagens:• Custo para recuperar os registros na ordem lexicográfica das chaves é alto;

• Pior caso é O(N).

Page 45: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da
Page 46: Pesquisa em Memória Primária · Funções de Transformação Uma função de transformação deve mapear chaves em inteiros dentro do intervalo [0.. −1], onde é o tamanho da

Atividade

Apresente a implementação da função hashing, de modo a tratar ascolisões pelos dois métodos: Listas Encadeadas e Endereçamento Aberto.