Escolar Documentos
Profissional Documentos
Cultura Documentos
Dicionrio
Continer onde objetos genricos so inseridos, removidos e acessados atravs de uma chave Cada item de um dicionrio um par chaveelemento
O elemento representa as informaes teis armazenadas A chave representa o meio de acesso s informaes
Exemplos
Agenda
Dados: informaes pessoais, nome, fone, email, etc Chave: nome
Carto de crdito
Dados: nmero, titular, limite, saldo disponvel Chave: nmero
Conta bancria
Dados: nmero, titular, saldo, data de abertura Chave: nmero
Tipos de Dicionrios
Dicionrio no ordenado
As chaves so armazenadas na ordem de insero O comparador implementa apenas uma verificao de igualdade no acesso e na remoo de elementos
Dicionrio ordenado
As chaves so armazenadas segundo algum critrio O comparador implementa um relao de ordem total nas operaes de acesso, insero e remoo Dicionriode elementos 4
Implementaes
Dicionrio no ordenado
Simples: Arquivo de Log
Vetor, Lista ou Sequncia no ordenada
Dicionrio ordenado
Simples: Tabela de pesquisa
Vetor ordenado
Otimizada: skip-list
Dicionrio 5
Dicionrio No-Ordenado
Mtodos genricos
int size() boolean isEmpty()
Mtodos de atualizao
Entry<K,V> insert (K key, V value)
insere o novo elemento value com chave key, retornando o elemento criado.
Dicionrio
Dicionrio No-Ordenado
Mtodos de acesso
Iterable<Entry<K,V>> entries()
Retorna uma coleo dos elementos chave-valor do dicionrio.
Dicionrio
find (2)
findAll(2) remove(find(5)) find(5)
(2,C)
{(2,C), (2,E)} (5,A) null
Dicionrio
Desempenho
Inseres ocorrem em tempo constante O(1): insert Remoes e localizaes ocorrem em tempo linear O(n): remove, find, findAll
Aplicaes
Dicionrios pequenos ou que requerem basicamente operaes de insero Ex: Arquivos de inicializao e Logs de sistemas operacionais
Dicionrio 10
Dicionrio
12
Desempenho
Inseres, localizaes e remoes executam em tempo esperado constante O(1)
Dicionrio 13
Tabela de Hash
Componentes
Arranjo de Buckets
Arranjo de N objetos que referenciam Itens (chaveelemento)
Funo de Hash
Codificar a chave em um inteiro entre 0 e N-1 0 1 2 3 4
Dicionrio
025-612-0001
451-229-0004
14
981-101-0004
Arranjo de Buckets
O arranjo de buckets um arranjo A de tamanho N, em que cada clula considerada como um bucket (ou seja, continer para pares chave-elemento)
Cada clula do arranjo pode conter um ou mais elementos A situao ideal ocorre quando existe apenas um elemento por clula
1, c B 0 1 2 3 3, a 4 5 3, b 6 7 8 9 7, d 7, g 7, e
Dicionrio
15
Arranjo de Buckets
O inteiro N determina a capacidade do arranjo e, por conseguinte, os possveis ndices e valores da chaves = [0, N-1]
Se as chaves forem inteiros bem distribudos no intervalo [0, N-1], o item (k, e) inserido no bucket A[k] Se as chaves forem inteiros fora do intervalo de ndices necessrio mape-las para o intervalo requerido Se as chaves no forem inteiros necessrio codific-las e mape-las Se as chaves no forem nicas, dois elementos podem ser mapeados para o mesmo bucket, gerando uma coliso que precisa ser tratada
Dicionrio 16
Desvantagens
O espao utilizado pelo dicionrio proporcional a N e no ao nmero de itens no dicionrio n
Dicionrio
17
Funo de Hash
A funo de hash objetiva mapear uma chave genrica k em um inteiro no intervalo [0, N-1]
A idia utilizar o valor da funo de hash h(k) como ndice no arranjo de buckets O item (k, e) inserido no bucket A[h(k)]
Dicionrio
18
Funo de Hash
A funo de hash realizada em duas etapas
Mapear a chave k em um inteiro: Cdigo hash: h1(k) Mapear o cdigo hash entre [0, N-1]: Mapa de Compresso: h2(k)
Objetos arbitrrios
cdigo de hash
... -2 -1 0 1 2 ...
Funo de compresso
0 1 2 3 ...
Dicionrio 19
N-1
Cdigo Hash
O objetivo mapear uma chave arbitrria em um nmero inteiro
O cdigo no precisa estar no intervalo [0, N-1] A funo hash deve evitar colises, gerando cdigos distintos para chaves diferentes A funo hash deve gerar o mesmo cdigo para chaves iguais
Dicionrio
20
Para tipos long e double, cuja representao em bits duas vezes maior do que um cdigo de hash, a converso iria ignorar metade da informao origninal. Uma alternativa somar a representao inteira dos bits de mais alta ordem com os de mais baixa ordem.
Divide o valor long em dois dados de 32 bits e realiza a soma static int hashCode(long i) { return (int) ( (i >>32) + (int) i ); }
Dicionrio 22
Dicionrio
23
static int hashCode(String s) { int hash=0; for (int i=0; i< s.length(). i++ ) { hash += s.charAt(i) * Math.pow(33, i) ; return hash; } Dicionrio 24
Mapa de Compresso
O objetivo mapear o cdigo hash gerado na primeira etapa da funo hash para um inteiro entre 0 e N-1 Funes de compresso
Mtodo da diviso
h2(k) = |k| % N Mtodo da multiplicao, adio e diviso (MAD) h2(k) = |ak + b| % N onde: k o cdigo hash N um nmero primo (minimiza as colises) A >0 (chamado de fator de ativao) um inteiro tal que a % N != 0 b >=0 (chamado shift) so constantes inteiras escolhidas aleatoriamente.
25
Dicionrio
Tratamento de Colises
Colises ocorrem quando duas chaves distintas k1 e k2 so tais que h(k1) = h(k2), ou seja, possuem o mesmo cdigo hash
As colises impedem que inseres, localizaes e remoes em uma tabela hash sejam feitas em O(1) usando A[h(k)]
Estratgias de tratamento
Encadeamento separado
Utiliza uma lista, vetor ou sequncia em cada ndice do arranjo A
Endereamento aberto
Utiliza clulas vazias do arranjo A, armazenando os elementos em ndices vizinhos aos ndices dados pelo cdigo hash
Dicionrio
26
Encadeamento Separado
Cada clula do arranjo A uma referncia para um vetor, lista ou sequncia de itens, onde os elementos com mesmo cdigo hash so armazenados Exemplo
Chaves inteiras Mapa de compresso: h(k) = k%13
0 1 2 3 4 5 6 7 8 9 10 11 12
41
28
54
18
36
10
90
12
38
25
Dicionrio
27
Endereamento Aberto
0 1 2 3 4 5 6 7 8 9 10
13
insero de k = 15
26
37 16
Quando o cdigo hash calculado, se a clula A[h(k)] est ocupada, uma outra clula do arranjo utilizada de acordo com um teste
Teste linear: A[(h(k)+i)%N] utilizada, com i = 1, 2, 3, ... Teste quadrtico: A[(h(k)+i)%N] utilizada, com i = 1, 4, 9, ... Hashing duplo: A[(h(k)+jh(k))%N] utilizada, com j = 1, 2, 3, ...
As operaes de insero, localizao e remoo tornam-se mais complexas e a utilizao do objeto especial AVAILABLE, usado para substituir os elementos removidos, recomendada Exemplo: Chaves inteiras, Mapa de compresso: h(k) = k%11 Dicionrio
28
Anlise de experimentos
Endereamento aberto: < 0.5
Agrupamentos crescem e testes do a volta no arranjo
Dicionrio
29
Referncia Bibliogrfica
Goodrich M., Tamassia R. Estrutura de Dados e Algoritmos em Java. 4 ed. Bookman, 2007.
Java.datastructures.net
Pilhas e Filas
30