Escolar Documentos
Profissional Documentos
Cultura Documentos
Tabelas Hash
Introdução
Função de Espalhamento
Colisões
Aplicações
Limitações
Classes HashMap, Hashtable e Iterator
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Função de Espalhamento
A função de espalhamento ou função hash é responsável
por gerar um índice a partir de determinada chave.
chave Ex:
id1
Conjunto id2
Conjuntode
de Função
chaves Funçãode
deespalhamento
espalhamento id3
chaves
idn
F(x)
F(x)== xxmod
modM
M
Onde M é o tamanho da tabela e x é um inteiro
correspondendo à chave
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Desvantagens:
Função extremamente dependente do valor de M escolhido
M deve ser um número primo (reduz endereços duplicados)
Valores recomendáveis de M devem ser > 20
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Colisões
Quando as entradas (chaves)
chaves são diferentes e,
passando pela função de espalhamento,
espalhamento geram a mesma
saída,
saída acontece o que chamamos de colisão
Colisões
Muitos programas funcionam sem a suspeita de que a
função hash seja ruim e atrapalhe o desempenho
Por causa das colisões, muitas tabelas hash são
aliadas com alguma outra estrutura de dados
Por exemplo, com listas encadeadas ou até
mesmo com árvores
Em outras oportunidades a colisão é solucionada
dentro da própria tabela
Por exemplo, com uma estrutura de dados que
verifique e corrija índices duplicados na tabela
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Tratamento de Colisões
Duas formas mais comuns para tratamento de colisões:
colisões
Encadeamento externo:
externo chaves em colisão são
armazenadas em uma lista encadeada, externa à tabela.
tabela
Cada posição da tabela de dispersão armazena um
ponteiro para o início desta lista Tabela Lista encadeada
0 NULL
Ex.: considerando as chaves x {5 8 35 38 91 61 63 28} 1 --> 61, 91
e M=10 em F(x) = x mod M 2 NULL
3 --> 63
Encadeamento interno:
interno chaves em colisão 4 NULL
5 --> 5, 35
são armazenadas na própria tabela hash 6 NULL
7 NULL
Basicamente, o que um algoritmo de encadeamento faz 8 --> 8, 38, 28
é armazenar na tabela informações sobre onde o próximo 9 NULL
registro deve ser buscado
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Classe HashMap
HashMap é uma estrutura para o rápido armazenamento
e recuperação de objetos, aceita objetos nulos, e não
garante fornecer uma lista em ordem cronológica de
inserção do conteúdo. Um exemplo de utilização:
import java.util.HashMap;
import java.util.HashMap;
public class aula8exemplo1
public class aula8exemplo1
{
{
public static void main (String args[])
public static void main (String args[]) chave-valor
{
{
HashMap telefones = new HashMap();
HashMap telefones = new HashMap();
telefones.put("Pizza", "34354455");
telefones.put("Pizza", "34354455");
String numero=(String)telefones.get("Pizza");
String numero=(String)telefones.get("Pizza");
System.out.println(numero);
System.out.println(numero);
}
} Obs.: permite predefinir o tipo <K,V>, evitando
}
} a necessidade de conversão cast
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Classe Hashtable
Hashtable é uma estrutura que implementa tabelas Hash
em JAVA, mapeando chaves para valores
Qualquer objeto não nulo pode ser usado como uma
chave ou como um valor
Exemplo:
Hashtable
Hashtable numeros
numeros == new
new Hashtable();
Hashtable();
numeros.put("um", 1);
numeros.put("um", 1);
numeros.put("dois",
numeros.put("dois", 2); 2);
numeros.put("tres",
numeros.put("tres", 3);3);
Integer
Integer nn == (Integer)numeros.get("dois");
(Integer)numeros.get("dois");
if
if (n != null) {{
(n != null)
System.out.println("dois
System.out.println("dois == "" ++ n);
n);
}}
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Meios de Acesso
Toda coleção possui uma representação interna
para o armazenamento e a organização de seus
elementos
Por outro lado, essa coleção deve permitir que seus
elementos sejam acessados sem que sua estrutura
interna seja exposta
A linguagem JAVA provê uma forma de
sequencialmente acessar os elementos de uma
coleção sem expor sua representação interna
Universidade do Estado de Santa Catarina – UDESC
Centro de Educação do Planalto Norte – CEPLAN
Meios de Acesso
De uma maneira geral,
geral pode-se desejar que os
elementos sejam percorridos de várias maneiras,
sem no entanto ter que modificar a interface da
coleção em função do tipo de varredura desejado
Interface Iterator
A interface Iterator (import java.util.Iterator;)
java.util.Iterator permite
implementar uma forma de percorrer os elementos
de uma coleção sem violar o encapsulamento da
mesma