ESTRUTURAS DE DADOS E ALGORITMOS TABELA HASH

Documentos relacionados
Tabelas Hash. Também conhecido como tabelas de dispersão. Até agora... MoFvação. Exercício

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

Tabelas de Dispersão. Estrutura de Dados e Algoritmos

Tabelas de dispersão/hash

Endereçamento Aberto

Agenda. Ideia. Buscar um item em um array. Função hash. Função hash. Hash Table. Introdução Definição Hash Table. Métodos de resolução de conflitos

Tabela Hash. Disciplina de Algoritmos e Estrutura de Dados III. Prof. Marcos Antonio Schreiner 15/05/2015

Hashing. Cormen Capítulo 11

Hashing. Prof. Josenildo Silva IFMA 2014

Algoritmos e Estrutura de Dados. Aula 11 Estrutura de Dados: Tabelas Hash Parte II Prof. Tiago A. E. Ferreira

Capítulo VIII. Tipo Abstracto de Dados Dicionário. Acesso por Chave

Matemática Discreta 12

Tabelas Hash O Que é uma Tabela Hash? O Que é uma Tabela Hash? O Que é uma Tabela Hash? Inserindo um Novo Registro. O Que é uma Tabela Hash?

Hashing: conceitos. Hashing

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA (ABORDAGEM RECURSIVA)

Tabelas de Dispersão. Tabela de Dispersão

Métodos de Busca. Parte 2. ICC2 Prof. Thiago A. S. Pardo. Baseado no material do Prof. Rudinei Goularte

Tabelas de Espalhamento (hash)

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA

Introdução Métodos de Busca Parte 2 - Hashing

TAD dicionário. Métodos do TAD dicionário:

Tabelas de símbolos e de distribuição AULA 23. Tabela de símbolos. Um exemplo simples. Interface

pior caso nas operações de manipulação é O(N) pior caso surge sistematicamente emusos correntes (ex: elementos previamente ordenados)

SCC0601 Introdução à Ciência da Computação II. Prof. Lucas Antiqueira

Métodos de Busca Parte 2

Algoritmos e Estruturas de Dados 2005/2006

Algoritmos de pesquisa. Tabelas de dispersão/hash

Tabela Hash. Prof. Msc. Mariella Berger

Tabelas Hash. informação, a partir do conhecimento de sua chave. Hashing é uma maneira de organizar dados que:

TABELA HASH. Prof. André Backes. Princípio de funcionamento dos métodos de busca

Dicionários. Prof. César Melo

Tabelas de hash Acabamos de estudar como implementar uma tabela hashing aberta e estudaremos agora como implementar uma tabela hashing fechada ou

indexação e hashing Construção de Índices e Funções Hash Diego Gomes Tomé - MSc. Informática Orientador: Prof. Dr. Eduardo Almeida October 13, 2016

Tabelas Hash. Prof. Túlio Toffolo BCC202 Aulas 23 e 24 Algoritmos e Estruturas de Dados I

HASHING HASHING 6/10/2008

MC3305 Algoritmos e Estruturas de Dados II. Aula 02 Hashing. Prof. Jesús P. Mena-Chalco.

TABELAS DE DISPERSÃO/HASH

Vamos considerar um arquivo de dados que armazena uma lista de alunos. Cada registro é um objeto com um número de matrícula e um nome.

Algoritmos e Estruturas de Dados 2008/2009

TABELAS HASH. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Tabelas Hash Endereçamento Direto

i a[i]

HASHING Hashing Motivação - Acesso Direto:

Introdução a Tabelas Hash

Implemente a função de remoção de uma chave na tabela hashing fechada em questão. void remover(tabela tabela, int n) {

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

Transformação de Chave. (Hashing)

Algoritmos e Estruturas de Dados: Tabela de Dispersão com Encadeamento

Tabelas de dispersão

Pesquisa em memória primária: hashing. Algoritmos e Estruturas de Dados II

ESTRUTURAS DE DADOS E ALGORITMOS ÁRVORE BINÁRIA

13 Hashing (parte 2) SCC201/501 - Introdução à Ciência de Computação II

Dicionários. TAD Orientado a conteúdo

Unidade: Tabela Hash e Grafos. Unidade I:

Transformação de Chave - Hashing

Hashing (Tabela de Dispersão)

Hashing Endereçamento Direto Tabelas Hash

UNIVERSIDADE DA BEIRA INTERIOR

Estruturas de Dados Tabelas de Espalhamento

Tabelas de Dispersão - Introdução (1)

UNIVERSIDADE DA BEIRA INTERIOR

Complexidade de Algoritmos

ACH2024. Aula 22 Hashing Externo - Hashing estático e dinâmico (extensível) Prof Helton Hideraldo Bíscaro

Algoritmos e Estruturas de Dados I. Hash Table - Python. Prof. Tiago Eugenio de Melo

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

Filas de prioridade. Marcelo K. Albertini. 3 de Dezembro de 2013

Tabelas Hash. Jeane Melo

Pesquisa em Memória Primária Hashing

Listas Lineares Ordenadas

ESTRUTURAS DE DADOS E ALGORITMOS HEAP BINÁRIA

Universidade de São Paulo

AED 2002/2003 p.1/16. Tabelas de Dispersão. Funçoes de dispersão Encadeamento externo Procura linear Double hashing Eficiência da procura

ALGORITMOS E ESTRUTURAS DE DADOS 2011/2012 DICIONÁRIO. Armanda Rodrigues 6 de Outubro 2011

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Lista de Exercícios 07 Introdução à Ciência de Computação II (SCC0201/501)

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

Estrutura de Dados Listas

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Tabela de símbolos: tabelas de espalhamento

A inserção da chave 6 da árvore acima resulta na árvore abaixo.

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Hashing. Rafael Nunes LABSCI-UFMG

Tabelas de Hash MBB. Novembro de Algoritmos e Complexidade LEI-LCC

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Universidade Estadual do Oeste do Parana - UNIOESTE Jhonata R.de Peder Marcelo Schuck

Tabelas Hash. Prof. Túlio Toffolo BCC202 Aula 21 Algoritmos e Estruturas de Dados I

Banco de Dados. Módulo 15 - Estruturas de Indexação

AED Algoritmos e Estruturas de Dados LEEC /2007. Tabelas de Dispersão

Lista de Exercícios 04

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Estruturas de dados para listas arrays e listas ligadas

Hashing. ACH Introdução à Ciência da Computação II. Delano M. Beder

Grupo 2 - Implementação de uma Classe Simples

O acesso aos elementos é aleatório, isto é, qualquer elemento numa colecção pode ser acedido realizando uma pesquisa pela chave.

As Listas são simples de se implementar, mas, com um tempo médio de acesso T = n/2, tornando-se impraticáveis para grandes quantidades de dados.

Coleções. João Paulo Q. dos Santos

ESTRUTURA DE DADOS E ALGORITMOS. Hashing (Tabela de Dispersão) Cristina Boeres

Transcrição:

ESTRUTURAS DE DADOS E ALGORITMOS 1 TABELA HASH Adalberto Cajueiro Departamento de Sistemas e Computação Universidade Federal de Campina Grande

ESTRUTURAS VISTAS ATÉ AGORA Busca O(n) Busca O(log(n)) 2

É POSSÍVEL? Add, search, remove em O(1)? 3

RELEMBRANDO: TABELA, MAPA, DICIONARIO Conceito <chave,valor> Operações put(k key, V value) -> T[k] = v get(k key) -> T[k] remove(k key) -> T[k] = null Sigla (chave) "MS" "PB" Capital (valor) "Campo Grande" "João Pessoa" "SP" "São Paulo" "RS" "Porto Alegre" Universo de chaves: U = {"MS", "PB", "PA", "AM", "PE", "RJ", "CE",. Chaves em uso: K = {"MS", "PB", "SP", "RS" 4

COMO IMPLEMENTAR? Qual a estrutura que pode nos dar acesso direto?

COMO IMPLEMENTAR? Sigla (chave) pos "MS" 0 "PB" 1 "SP" 2 "RS" 3 0 1 2 3 Capital "Campo Grande" "João Pessoa" "São Paulo" "Porto Alegre" Como mapear as chaves em valores? Tabela (vetor) indexada por inteiros.

TABELAS HASH Função Hash: calcula um valor inteiro a partir de uma chave. Determinística "MS" "PB" Função hash 0 1 Capital "Campo Grande" "João Pessoa" "SP" 2 "São Paulo" "RS" 3 "Porto Alegre"

TABELA DE ACESSO DIRETO U == T hash(k key) -> {0,1,2,3,...,m Sobrejetora: toda chave é mapeada para um valor Injetora: cada valor é referente a apenas uma chave

NO NOSSO CASO hash(k key) -> {0,1,2,3,...,26 put(key k, Element e) T[hash(k)] = e remove(key k) T[hash(k)] = null O(1) search(key k) return T[hash(key)]

E SE... Conjunto de chaves (U) for muito grande? Muito maior que o tamanho da estrutura (T) para armazena-lás? U >> T Exemplo: Matrículas de alunos da UFCG (8 dígitos) Quantas chaves possíveis?

TABELA HASH K: conjunto de chaves efetivamente utilizadas Apenas dos alunos de CC, por exemplo U >> K A tabela precisa apenas ter K posições Espaço gasto O( K )

TABELAS HASH 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 Usa uma funcao de hashing (tem que ser determinística) para mapear chaves em índices h : U {0,..., m 1 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 12

EXEMPLO 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. Universo de Chaves (U) K 5 2 9 / / / / / / / 2... 5... 9... 13

EXEMPLO O que acontece se utilizarmos a função hash h(k)=k%10 para inserir os elementos {2,5,9,12? Universo de Chaves (U) 5 2 12 9 / / / / / / / 2... 5... 9... 14

COLISÕ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 15

RESOLUÇÃO DE COLISÕES (ABORDAGENS) 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 16

ENDEREÇAMENTO FECHADO: CHAINING Usar uma lista encadeada 17

EXERCÍCIO Implemente as operações (inserir, remover, pesquisar) utilizando a resolução de conflitos by chaining? Inserir(T,x) Remover(T,x) Pesquisar(T,k) 18

EXERCÍ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

EXERCÍ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)]; Faça a análise do pior caso das operações (inserir, remover, pesquisar) 20

EXERCÍ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? 21

EXERCÍ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? 4 8 2 6 / 8... 6... 4... 2... 22

FATOR DE CARGA 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 hash com 50 células e 100 chaves? 23

EXERCÍCIO Qual o limite assintoticamente restrito usando o fator de carga (α) para uma pesquisa? i...... h(ki)... h(kj)...... h(kn)... T Θ(1+ α) Aplicar a função hash 24

EXERCÍCIO Quando uma pesquisa será feita em Θ(1)? α = n/m = O(1) n = O(m) T i...... h(ki)... h(kj)...... h(kn)... Θ(1+ α) 25

EXERCÍCIO Vamos utilizar a função hash h(k) = k%m (m=10) para guardar os CPFs. Como vai ficar a tabela? Será que tem alguma função hash melhor? Como escolher uma função hash? 26

CARACTERÍSTICAS DA FUNÇÃO HASHING 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 DIVISÃO Usa o resto da divisão para encotrar valores hash Neste método a função hash é da forma: h(k) = k mod m Número de células da tabela Método rápido (requer apenas uma divisao) 28

EXERCÍCIO 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 DIVISÃ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? 30

MÉTODO DA DIVISÃ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? Não escolha um m tal que tenha um divisor d bem pequeno Não escolha m = 2 r, Escolha m sendo um número primo que não seja próximo das potências de 2 ou 10 31

MÉTODO DA DIVISÃO Suponha que um conjunto de 2000 elementos será armazenado em uma tabela hash onde o fator de carga estimado é 3. Qual seria a melhor função de hash para o problema usando o método da divisão? 32

MÉTODO DA DIVISÃO Suponha que um conjunto de 2000 elementos será armazenado em uma tabela hash onde o fator de carga estimado é 3. Qual seria a melhor função de hash para o problema usando o método da divisão? h(k) = k % m 2000/3 ~ 667 Primos: 673, 677,683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797,... Potencias de 2: 256, 512, 1024, 2048,... 33 512 1024 768

EXERCÍ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? 34

405 410 415 420 425,..., 495, 500 001 006 011 016 021,..., 091, 096 EXERCÍ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? 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 0... 5... 10... K % 100 K % 101 200, 300, 400, 500 205, 305, 405, 505 210, 310, 410, 510 Multiplos de 101: 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 022,..., 092, 097 35

MÉTODO DA MULTIPLICAÇÃO Neste método a função hash é da forma: h(k) = m (k.a mod 1) k é a chave Extrai a parte fracionária de k.a A é uma constante entre (0..1) Um bom valor é A ( 5 1) / 2 0.6180339887... m (número de células) geralmente é 2 p, 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 36

EXERCÍ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 h(2) = 1000 (2x0.2 mod 1) = 400 h(3) = 1000 (3x0.2 mod 1) = 600 h(4) = 1000 (4x0.2 mod 1) = 800 h(5) = 1000 (5x0.2 mod 1) = 000 h(6) = 1000 (6x0.2 mod 1) = 200 h(10) = 1000 (10x0.2 mod 1) = 000 h(15) = 1000 (15x0.2 mod 1) = 000 37

QUESTÕES DE IMPLEMENTAÇÃO Hashtable HashFunction AbstractHashtable AbstractHashtableClosedAddress HashFunctionClosedAddress int hash(t element) HashtableClosedAddressImpl HashFunctionDivision HashFunctionMultiplication Única classe que o aluno precisará editar 38

QUESTÕES DE IMPLEMENTAÇÃO public interface Hashtable<T> { public boolean isempty(); public boolean isfull(); public int capacity(); public int size(); public void insert(t element); public void remove(t element) ; public T search(t element); public int indexof(t element); public interface HashFunction<T> { 39

QUESTÕES DE IMPLEMENTAÇÃO public abstract class AbstractHashtable<T> implements Hashtable<T> { Object[] table; int elements; int COLLISIONS; HashFunction<T> hashfunction; public AbstractHashtable(){ elements = 0; COLLISIONS = 0; protected void initiateinternaltable(int size){ this.table = Util.<T>makeArray(size); @Override public boolean isempty() { return (elements == 0); 40

QUESTÕES DE IMPLEMENTAÇÃO @Override public boolean isfull() { return (elements == table.length); @Override public int size() { return elements; @Override public int capacity(){ return this.table.length; public int getcollisions() { return COLLISIONS; 41

QUESTÕES DE IMPLEMENTAÇÃO public abstract class AbstractHashtableClosedAddress<T> extends AbstractHashtable<T> { public AbstractHashtableClosedAddress(){ super(); @Override protected void initiateinternaltable(int size){ this.table = Util.<LinkedList<T>>makeArray(size); public static <T> T[] makearray(int size) { T[] array = (T[]) new Object[size]; return array; 42

QUESTÕES DE IMPLEMENTAÇÃO public interface HashFunction<T> { public interface HashFunctionClosedAddress<T> extends HashFunction<T> { public int hash(t element); 43

QUESTÕES DE IMPLEMENTAÇÃO public class HashFunctionDivisionMethod<T> implements HashFunctionClosedAddress<T> { protected int tablesize; public HashFunctionDivisionMethod(int tablesize) { this.tablesize = tablesize; public int hash(t element) { int hashkey = -1; int key = element.hashcode(); hashkey = (int) key % tablesize; return hashkey; 44

QUESTÕES DE IMPLEMENTAÇÃO public class HashFunctionMultiplicationMethod<T> implements HashFunctionClosedAddress<T>{ protected int tablesize; private static final double A = (Math.sqrt(5)-1)/2; public HashFunctionMultiplicationMethod(int tablesize){ this.tablesize = tablesize; public int hash(t element) { int hashkey = -1; int key = element.hashcode(); double fractionalpart = key*a - Math.floor(key*A); hashkey = (int) (tablesize * fractionalpart);; return hashkey; 45

QUESTÕES DE IMPLEMENTAÇÃO public enum HashFunctionClosedAddressMethod { DIVISION, MULTIPLICATION; public class HashFunctionFactory<T> { public static HashFunction createhashfunction(hashfunctionclosedaddressmethod method, int tablesize){ HashFunction result = null; switch (method) { case DIVISION: result = new HashFunctionDivisionMethod(tableSize); case MULTIPLICATION: result = new HashFunctionMultiplicationMethod(tableSize); return result; 46

QUESTÕES DE IMPLEMENTAÇÃO public class HashtableClosedAddressImpl<T> extends AbstractHashtableClosedAddress<T> { public HashtableClosedAddressImpl(int desiredsize, HashFunctionClosedAddressMethod method) { int realsize = desiredsize; if(method == DIVISION){ realsize = this.getprimeabove(desiredsize); initiateinternaltable(realsize); HashFunction function = HashFunctionFactory.createHashFunction(method,realSize); this.hashfunction = function; 47

QUESTÕES DE IMPLEMENTAÇÃO int getprimeabove(int number){ //use Util.isPrime(n) public void insert(t element) { public void remove(t element) { public T search(t element) { public int indexof(t element) { 48

TABELA COM ENDEREÇAMENTO ABERTO 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 49

OUTRA FORMA DE RESOLVER CONFLITOS 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 p = probe 50

EXEMPLO: INSERÇÃO Insira a chave k=100 Probe h(100,0) Probe h(100,1) Probe h(100,2) / 100 / 200 / / 150 / / / 999 51

ALGORITMO: INSERÇÃO 52

EXEMPLO: PESQUISA Pesquisa a chave k=100 Probe h(100,0) Probe h(100,1) Probe h(100,2) / / 200 / / 150 / / / 999 53

ALGORITMO: PESQUISA 54

ENDEREÇAMENTO ABERTO (DELEÇÃO) Como fazer uma remocao com enderecamento aberto? Podemos atribuir NIL diretamente na posição da chave a ser removida? 55

ENDEREÇAMENTO ABERTO (DELEÇÃ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) 56

EXEMPLO 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 / 100 X 200 / / 150 / / / 999 E como ficaria a inserção? 57

EXEMPLO T[j] = DELETED 58

HASHING COM PROBING 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 59

LINEAR PROBING Dada uma funcao de hash ordinaria h' : U {0,1,..., m (obtida por divisão ou multiplicação) o método usa a função de hash da forma: h( k, i) ( h'( k) i) mod m 1 Slots buscados linearmente T[( h'( k)] T[ h'( k) 1]... T[ m 1] Facil de implementar mas apresenta problemas Clustering Primário clusters podem surgir quando slots ocupados se agrupam. Isso aumenta o tempo da busca. 60

EXERCÍCIO Seja m=10, h(k) = k mod 5. Utilize o probing linear para inserir os valores ({10,15,2,12,4,8) h(k,i) = (k mod 5 + i) mod 10 61

PROBING QUADRÁTICO Neste método a função hash é da forma: h( k, i) ( h'( k) c i 1 c 2 i 2 ) mod m c 1 e c 2 são constantes Método da Divisão ou Multiplicação 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 62

EXERCÍCIO Seja m=10, c 1 =3, c 2 =5, h(k) = k mod 5. Utilize o probing quadrático para inserir os valores ({10,15,2,12,4,8): h(k,i) = (k mod 5 + 3i + 5i 2 ) mod 10 63

EXERCÍ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): h(k) = k mod 10 h(k,i) = (k mod 5 + i) mod 10 h(k,i) = (k mod 5 + 3i + 5i 2 ) mod 10 64

HASHING DUPLO Um dos melhores metodos para endereçamento aberto Neste método a função hash é da forma: h( k, i) ( h1 ( k) i. h2 ( k)) modm Método da Divisão ou Multiplicação A sequencia de probe depende de duas formas em k. Dicas Faça h 2 (k) retornar um número ímpar e m ser um número 2 p Faça m ser um numero primo e h 2 (k) retornar um inteiro positivo menor que m Excelentes resultados Produz Θ(m) sequências (se aproxima mais do hashing uniforme simples) 65

EXERCÍCIO Seja m=24, h 1 (k) = k mod 5 e h 2 (k) = k+1 mod 7. Utilize o hashing duplo para inserir os valores ({10,15,2,12,4,8): h(k,i) = (k mod 5 + (k+1 mod 7).i) mod 24 66

POSCOMP 2009 67

POSCOMP 2009 68

FATOR DE CARGA Qual o fator de carga no endereçamento aberto? O load factor é 1 Por que? 69

LIDANDO COM OVERFLOW O que fazer quando o vetor interno da tabela hash ficar cheio? Duplicar quando estiver cheio? Duplicar quando atingir uma certa capacidade? 70

REHASHING 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 71

EXEMPLO 34 40 X 11 95 Tamanho = 7 Tamanho = 13 40 95 34 11 Object put() {... if (++size > threshold) rehash();... void rehash() {... newcapacity = prime number near 2*buckets; threshold = (int) (newcapacity * loadfactor); buckets = new HashEntry[newcapacity];... 72

EXERCÍ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) 73

IMPLEMENTAÇÃO Hashtable http://www.docjar.com/html/api/java/util/hashtable.java.htm l 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) 74

TABELA HASH (IMPLEMENTAÇÃO) Separando a tabela de sua função hash? Hashtable HashFunction 75

QUESTÕES DE IMPLEMENTAÇÃO Hashtable HashFunction AbstractHashtable AbstractHashtableOpenAddress HashFunctionOpenAddress int hash(t element) HashtableOpenAddressImpl HashFunctionLinearProbing HashFunctionQuadracticProbing Única classe que o aluno precisará editar HashFunctionDoubleHashing 76

QUESTÕES DE IMPLEMENTAÇÃO public abstract class AbstractHashtableOpenAddress<T> extends AbstractHashtable<T> { protected final DELETED deletedelement = new DELETED(); private int tablesize; public AbstractHashtableOpenAddress(){ this.tablesize = tablesize; this.initiateinternaltable(size); @Override protected void initiateinternaltable(int size){ this.table = Util.<Storable>makeArray(size); public static <T> T[] makearray(int size) { T[] array = (T[]) new Object[size]; return array; 77

QUESTÕES DE IMPLEMENTAÇÃO public abstract class AbstractHashtableOpenAddress<T> extends AbstractHashtable<T> { protected final DELETED deletedelement = new DELETED(); private int tablesize; public AbstractHashtableOpenAddress(){ this.tablesize = tablesize; this.initiateinternaltable(size); @Override protected void initiateinternaltable(int size){ this.table = Util.<Storable>makeArray(size); public interface Storable { 78

QUESTÕES DE IMPLEMENTAÇÃO public interface HashFunction<T> { public interface HashFunctionOpenAddress<T> extends HashFunction<T> { public int hash(t elemento, int probe); 79

QUESTÕES DE IMPLEMENTAÇÃO public HashFunctionLinearProbing<T> implements HashFunctionOpenAddress<T> { protected HashFunctionClosedAddress<T> originalhashfunction; protected int tablecapacity; public HashFunctionLinearProbing(int tablecapacity, HashFunctionClosedAddressMethod method) { this.tablecapacity = tablecapacity; if(method == HashFunctionClosedAddressMethod.DIVISION){ originalhashfunction = new HashFunctionDivisionMethod<T>(tableCapacity) else{ originalhashfunction = new HashFunctionMultiplicationMethod<T> (tablecapacity); 80

QUESTÕES DE IMPLEMENTAÇÃO @Override public int hash(t element, int probe) { int generatedindex = 0; generatedindex= ((originalhashfunction.hash(element) + probe) % this.hashtable.capacity()); return generatedindex; 81

QUESTÕES DE IMPLEMENTAÇÃO public class HashFunctionQuadraticProbing<T> implements HashFunctionOpenAddress<T> { private int tablecapacity; protected HashFunctionClosedAddress<T> originalhashfunction; protected int c1; protected int c2; public HashFunctionQuadraticProbing(int tablecapacity, HashFunctionClosedAddressMethod method,int c1, int c2) { this.tablecapacity = tablecapacity; if(method == HashFunctionClosedAddressMethod.DIVISION){ originalhashfunction = new HashFunctionDivisionMethod<T>(tableCapacity); else{ originalhashfunction = new HashFunctionMultiplicationMethod<T>(tableCapacity); this.c1 = c1; this.c2 = c2; 82

QUESTÕES DE IMPLEMENTAÇÃO @Override public int hash(t element, int probe) { int generatedindex = 0; generatedindex = originalhashfunction.hash(element); generatedindex = ((generatedindex + c1*probe + c2*probe*probe)% tablecapacity); return generatedindex; 83

QUESTÕES DE IMPLEMENTAÇÃO public abstract class AbstractHashtableOpenAddress<T extends Storable> extends AbstractHashtable<T> { protected final DELETED deletedelement = new DELETED(); private int tablesize; public AbstractHashtableOpenAddress(int size) { this.tablesize = size; this.initiateinternaltable(size); @Override protected void initiateinternaltable(int size) { this.table = Util.<Storable>makeArray(size); 84

QUESTÕES DE IMPLEMENTAÇÃO public abstract class AbstractHashtableOpenAddress<T extends Storable> extends AbstractHashtable<T> { protected final DELETED deletedelement = new DELETED(); private int tablesize; public AbstractHashtableOpenAddress(int size) { public class DELETED implements this.tablesize = size; Storable{ this.initiateinternaltable(size); public DELETED() { @Override protected void initiateinternaltable(int size) { this.table = Util.<Storable>makeArray(size); 85

QUESTÕES DE IMPLEMENTAÇÃO public class HashtableOpenAddressLinearProbingImpl<T extends Storable> extends AbstractHashtableOpenAddress<T> { public HashtableOpenAddressLinearProbingImpl(int size, HashFunctionClosedAddressMethod method) { super(size); hashfunction = new HashFunctionLinearProbing<T>(size, method); this.initiateinternaltable(size); //métodos a implementar 86

QUESTÕES DE IMPLEMENTAÇÃO public class HashtableOpenAddressQuadraticProbingImpl<T extends Storable> extends AbstractHashtableOpenAddress<T> { public HashtableOpenAddressQuadraticProbingImpl(int size, HashFunctionClosedAddressMethod method, int c1, int c2) { super(size); hashfunction = new HashFunctionQuadraticProbing<T>(size, method, c1, c2); this.initiateinternaltable(size); //métodos a implementar 87

QUESTÕES DE IMPLEMENTAÇÃO public class HashtableOpenAddressDoubleHashing<T extends Storable> extends AbstractHashtableOpenAddress<T> { public HashtableOpenAddressDoubleHashing(int size, HashFunctionClosedAddressMethod methodfunction1, HashFunctionClosedAddressMethod methodfunction2) { super(size); hashfunction = new HashFunctionDoubleHashing<T>(size, methodfunction1, methodfunction2); this.initiateinternaltable(size); //métodos a implementar 88

REFERÊNCIAS Capítulo 11 2a edição 89