HASHING Katia Guimarães julho/2002 katia@cin.ufpe.br.

Slides:



Advertisements
Apresentações semelhantes
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Advertisements

Algoritmos em Grafos (Parte 2)
ALINHAMENTOS LOCAIS E SEMI-GLOBAIS
Katia S. Guimarães QUICKSORT Katia S. Guimarães
Grafos Introdução
Listas Lineares Estrutura que permite representar um conjunto de dados de forma a preservar a relação de ordem linear. Uma lista linear é composta de nós,
Gerenciamento de memória
Pesquisa em Memória Primária
Pesquisa em Memória Primária - Hashing
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
Pesquisa em Memória Primária
Qualiti Courses :: Documento de Requisitos. {icc2, jmmn, mmc2, CIn-UFPE Equipe Ivan Cordeiro Cardim Julio Maravitch Maurício.
Hashing (Espalhamento)
Indexação e Hashing Muitas consultas referenciam apenas uma pequena porção dos registros em uma tabela. Portanto necessitamos ser capaz de localizar estes.
O uso de questionários em trabalhos científicos
Universidade Federal do Espírito Santo Programação II Professora: Norminda Luiza.
Análise Léxica Supondo o trecho de programa abaixo:
Complexidade de Computação Para avaliar a qualidade de um algoritmo usamos como critério o espaço e o tempo de execução. Ao.
Introdução à NP-completude
Robson Godoi / Sandra Siebra
1MF. Vectores Tipo de dado usado para representar um CONJUNTO de dados do um mesmo tipo Estrutura de dados homogénea unidimensional Ex: Ler a nota de 3.
Backtracking Katia Guimarães.
Listas Encadeadas.
Marco Antonio Montebello Júnior
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Silogística Tudo o que os artistas fazem é arte.
Sistemas Operacionais Gerenciamento de Memória
Aula prática 6 Vetores e Matrizes
Intr. à Biologia Computacional
Intr. à Biologia Computacional ALINHAMENTO DE SEQÜÊNCIAS.
Pesquisa em memória primária: hashing
Sistemas Operacionais
Sistemas Operacionais
Algorítmos e estrutura de dados III
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
FABER Cirurgia & Implantes.
LÓGICA FILOSÓFICA. Teoria Obj: Construir um conceito de lógica
Hashing - Espalhamento
Hash tables Fábio Nakano.
ALINHAMENTOS LOCAIS E SEMI-GLOBAIS
Listas, Filas e Pilhas Katia Guimarães.
Introdução à NP-completude Katia S. Guimarães
Algoritmos Gulosos em Grafos
Katia S. Guimarães Busca em Grafos Katia S. Guimarães
Abordagens para problemas NP-completos
Árvores Binárias e Encaminhamentos
Katia S. Guimarães Heaps Katia S. Guimarães
Remoção e Inserção em Heaps
Katia S. Guimarães Heapsort Katia S. Guimarães
Árvores de Busca Katia Guimarães.
Listas de Prioridades Em muitas aplicações, dados de uma coleção são acessados por ordem de prioridade A prioridade associada a um dado pode ser qualquer.
Ferramentas de Planejamento
Análise Léxica.
Sistemas Operacionais
Módulo I Capítulo 5: Vetores
Sistemas Operacionais
SISTEMAS OPERACIONAIS I Gerenciamento de Arquivos
Tabelas Hash Prof. Túlio Toffolo
MANUAIS NA EMPRESA
Tabela Hash Alunos : Gustavo Jorge Zanin nºUSP
Lista Linear Base para outras estruturas
Faculdade Pernambucana - FAPE Setembro/2007
Aula Prática 12 Listas Encadeadas Monitoria
PROGRAMAÇÃO II – PARTE 6 Profa. Maria Augusta Constante Puget.
Estruturas de Dados Murilo Salgado Razoli.
Estrutura de dados Aula 6 - hash
INTRODUÇÃO THOBER CORADI DETOFENO, MSC. Aula 02 JOINVILLE 2015 Universidade do Estado de Santa Catarina – CCT/UDESC.
Hashing (Tabela de Dispersão)
Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva.
Transcrição da apresentação:

HASHING Katia Guimarães julho/2002 katia@cin.ufpe.br

HASHING Suponha que você pudesse criar um array onde qualquer item pudesse ser localizado através de acesso direto. Isso seria ideal em aplicações do tipo Dicionário, onde gostaríamos de fazer consultas aos elementos da tabela em tempo constante. Ex: Tabela de símbolos em compiladores. julho/2002 katia@cin.ufpe.br

O Tamanho de uma tabela HASH Um problema é que – como o espaço de chaves, ou seja, o número de chaves diferentes, é muito grande – este array teria que ter um tamanho muito grande. Ex: Se fosse uma tabela de nomes com 20 caracteres por nome, teríamos 2026 > 1626 = (24)26 = 2104 possíveis elementos. Haveria também o desperdício de espaço, pois a cada execução somente uma pequena fração das chaves estarão de fato presentes. julho/2002 katia@cin.ufpe.br

Para que serve Hashing? O objetivo de hashing é mapear um espaço enorme de chaves em um espaço de inteiros relativamente pequeno. Isso é feito através de uma função chamada hash function. O inteiro gerado pela hash function é chamado hash code e é usado para encontrar a localização do item. julho/2002 katia@cin.ufpe.br

Exemplo de Hashing Suponha que 1. O espaço de chaves são os números inteiros de quatro dígitos, e 2. Deseja-se traduzí-los no conjunto {0, 1, ..., 7}. Uma hash function poderia ser: f(x) = (5 • x) mod 8. julho/2002 katia@cin.ufpe.br

Exemplo de Hashing Se o conjunto de dados for constituído pelos anos: 1055, 1492, 1776, 1812, 1918 e 1945, a hash function f (x) = (5 • x) mod 8 gerará o seguinte mapeamento: Ex: f (1055) = (5 • 1055) mod 8 = 5275 mod 8 = 3 Índice: 0 1 2 3 4 5 6 7 Chave: 1776 1055 1492 1945 1918 1812 2002 Ex: f (2002) = (5 • 2002) mod 8 = 10010 mod 8 = 2 julho/2002 katia@cin.ufpe.br

Colisão No exemplo anterior dizemos que entre as chaves 1492 e 1812 ocorreu uma colisão, isto é estas duas chaves geraram o mesmo hash code, ou seja, foram mapeadas no mesmo índice. Índice: 0 1 2 3 4 5 6 7 Chave: 1776 2002 1055 1492 1945 1918 1812 julho/2002 katia@cin.ufpe.br

Resolvendo Colisões O desejável seria que a função fosse injetiva, de forma a evitar colisões, mas como isso é muito difícil, há vários esquemas para trabalhar a ocorrência de colisões. Há duas grandes classes de abordagens: 1. Closed Address Hashing (endereçamento fechado) 2. Open Address Hashing (endereçamento aberto) julho/2002 katia@cin.ufpe.br

Closed Address Hashing (endereçamento fechado) Closed Address Hashing ou hashing encadeado é a forma mais simples de tratamento de colisão. Cada entrada H[i] da tabela hash é uma lista ligada, cujos elementos têm hash code i. Para inserir um elemento na tabela: 1. Compute o seu hash code i, e 2. Insira o elemento na lista ligada H[i]. julho/2002 katia@cin.ufpe.br

Closed Address Hashing (endereçamento fechado) Problemas com o comprimento da lista ligada Embora uma função hash bem escolhida promova um bom balanceamento, não se pode garantir que as listas terão tamanhos próximos. Seria possível substituir a lista ligada por estruturas mais eficientes de busca, como árvores balanceadas, mas isso não se faz na prática. julho/2002 katia@cin.ufpe.br

Open Address Hashing (endereçamento aberto) É uma estratégia para guardar todas as chaves na tabela, mesmo quando ocorre colisão. H[i] contém uma chave, ao invés de um link. Tem a vantagem de não usar espaço extra. Em caso de colisão, um novo endereço é computado. Esse processo é chamado rehashing. julho/2002 katia@cin.ufpe.br

Rehashing por Linear Probing A forma mais simples de rehashing é linear probing. Se o hash code f (K) = i, e alguma outra chave já ocupa a posição H[i], então a próxima posição disponível na tabela H será ocupada pela chave K : rehash (i) = (i+1) mod h. julho/2002 katia@cin.ufpe.br

Rehashing por Linear Probing Ex: Se o conjunto de dados for constituído pelos anos: 1055, 1492, 1776, 1812, 1918 e 1945, a hash function f (x) = (5 • x) mod 8, e usando linear probing na colisão. Índice: 0 1 2 3 4 5 6 7 Chave: 1776 1055 1492 1812 1918 1945 1812 1945 rehash (4) = (4+1) mod 8 = 5 rehash (5) = (5+1) mod 8 = 6 rehash (6) = (6+1) mod 8 = 7 julho/2002 katia@cin.ufpe.br

Rehashing por Linear Probing Note que: 1. É possível que uma posição i da tabela Hash já esteja ocupada com alguma chave cujo hash code é diferente de f (K). 2. Rehashing por linear probing não depende do valor da chave K. julho/2002 katia@cin.ufpe.br

Rehashing por Linear Probing Para recuperar uma chave: 1. Compute o valor de f (K) = i. 2. Se H[i] está vazia, então K não está na tabela. 3. Se H[i] contém alguma chave diferente de K, então compute rehash (i) = i1 = (i + 1) mod h. 4. Se H[i1] está vazia, então K não está na tabela. Senão, se H[i1] contém alguma chave diferente de K, então rehash (i1), etc ... julho/2002 katia@cin.ufpe.br

Rehashing por Linear Probing Rehashing por Linear Probing pode trazer sérios problemas de colisão se houver uma alta taxa de ocupação na tabela Hash. É importante manter a taxa de ocupação próxima a 0,5 (50% do espaço). julho/2002 katia@cin.ufpe.br

Rehashing por Double Hashing Um método mais efetivo de fazer rehashing é por Double Hashing. Ao invés de fazer os incrementos de 1 invariavelmente, os incrementos são feitos por um valor d, que depende da chave K. Ex: d = HashIncr (K) rehash (j, d) = (j+d) mod h. julho/2002 katia@cin.ufpe.br

Rehashing por Double Hashing Ex: Conjunto de dados: 1055, 1492, 1776, 1812, 1918 e 1945 Hash function f (x) = (5 • x) mod 8 Colisões resolvidas por double hashing com HashIncr(K) = K mod 7 Índice: 0 1 2 3 4 5 6 7 Chave: 1776 1812 1055 1492 1945 1918 1812 HashIncr (K) = (K mod 7) = (1812 mod 7) = 6 rehash (4, 6) = (4 + 6) mod 8 = 2 julho/2002 katia@cin.ufpe.br

Removendo Elementos da Tabela A remoção é uma operação delicada em tabelas Hash. Usa-se um bit para indicar se a posição está, de fato, ocupada por um elemento válido da tabela, ou se o dado que se encontra naquela entrada não faz parte da mesma. julho/2002 katia@cin.ufpe.br