Hashing. Rafael Nunes LABSCI-UFMG



Documentos relacionados
HASHING. Katia Guimarães. 1

Tabelas Hash. Jeane Melo

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Tabela de símbolos: tabelas de espalhamento

Tabelas de Espalhamento

Algoritmos de pesquisa. Tabelas de dispersão/hash

Hashing. Estruturas de Dados. Motivação

Estrutura de Dados. Unidade VI. -Tabela Hash -Grafos. Prof. Ms. Amilton Souza Martha

Pesquisa Sequencial e Binária

Árvores Binárias de Busca

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

JSP - ORIENTADO A OBJETOS

DICIONÁRIOS. template<class K,class T> class Par { public: K chave; T valor; Par():chave(),valor()

DAS5102 Fundamentos da Estrutura da Informação

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Árvores Binárias de Busca

Métodos de Pesquisa em Memória Primária

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

Complexidade de Algoritmos

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º

Hashing Letícia Rodrigues Bueno

2ª Lista de Exercícios

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa

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

Busca. Pesquisa sequencial

Orientação a Objetos

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Matemática Discreta 12

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Batalha Naval Algoritmos de Busca. Correlações curriculares Matemática: Números: maior que, menor que, iguais a.

Árvores de Suporte de Custo Mínimo

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Unidade 5 Armazenamento e Indexação

Sumário. 5COP096 Teoria da Computação Aula 8 Pesquisa em Memória Primária

Algoritmos de Busca em Tabelas

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Índices* Professora Rosane Minghim. * Baseado no material de Leandro C. Cintra e M. C. F. de Oliveira. Fonte: Folk & Zoelick, File Structures.

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

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Tipos agregados. Tipos estruturados

Árvore B UNITINS ANÁLISE E DESENVOLVIMENTO DE SISTEMAS 3º PERÍODO 43

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

Estruturas de Dados I

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Árvore Binária de Busca

Ficha da Unidade Curricular (UC)

Algoritmos e Estrutura de Dados III. Árvores

-Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada;

Diminui o gargalo existente entre processador e memória principal; 5 a 10 vezes mais rápidas que a memória principal; Ligada diretamente à MP;

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

Web site. Objetivos gerais. Introdução. Profa. Patrícia Dockhorn Costa

Unidade IV: Ponteiros, Referências e Arrays

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Trabalho Prático n. 2

Árvores Binárias - continuação

Exercícios de Fixação Pseudocódigo e Estruturas Básicas de Controle

5COP096 TeoriadaComputação

MANUAL DO UTILIZADOR

Hashing (Tabela de Dispersão)

Algoritmos de Pesquisa e Ordenação em Vectores

Métodos Os métodos de uma classe podem ser classificados como construtores, destrutores, funções ou procedimentos.

Solução do segundo exercício proposto REDE DE HOTÉIS

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa

Prof. Daniela Barreiro Claro

Manutenção de Arquivos

Figura 1 Busca Linear

Projeto e Análise de Algoritmos. Profa. Juliana Kaizer Vizzotto. Projeto e Análise de Algoritmos - Aula 1

10) REGISTROS : Exemplos: var N,I: integer; A,B,C: real; CHAVE: boolean; CARAC: char; V: array[1..20] of real; M: array[1..10,1..

3 Sistemas de Numeração:

Estruturas de Dados Aula 15: Árvores 17/05/2011

Banco de Dados Modelo Conceitual, Lógico, Físico, Entidade- Relacionamento (ER) Hélder Nunes

Algoritmos e Estruturas de Dados: Árvore Binária

Introdução a Java. Hélder Nunes

BC1424 Algoritmos e Estruturas de Dados I. Aula 16: Árvores (introdução) Prof. Jesús P. Mena-Chalco. jesus.mena@ufabc.edu.br

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Análise de complexidade

Universidade Federal de Santa Catarina Centro Tecnológico Departamento de Informática e Estatística Curso de Graduação em Ciências da Computação

Crash recovery é similar ao instance recovery, onde o primeiro referencia ambientes de instância exclusiva e o segundo ambientes parallel server.

Linguagem C: Árvores Binarias

TOTVS BA Guia de Customização Linha Logix

Programação para Android. Aula 07: Persistência de dados Shared Preferences, Internal e External Storage

INF 1007 Programação II

Cálculo utilizando variáveis do tipo DATA

Prof. Antonio Fundamentos de Sistemas Operacionais UNIP/2015

BC Sistemas Operacionais Sistema de Arquivos (aula 10 Parte 2) Prof. Marcelo Z. do Nascimento

Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior

Manual do Publicador. Wordpress FATEA Sistema de Gerenciamento de Conteúdo Web

Padrões de Projeto. Singleton

Backup. Permitir a recuperação de sistemas de arquivo inteiros de uma só vez. Backup é somente uma cópia idêntica de todos os dados do computador?

Transcrição:

Hashing Rafael Nunes LABSCI-UFMG

Sumário Mapeamento Hashing Porque utilizar? Colisões Encadeamento Separado Endereçamento Aberto Linear Probing Double Hashing Remoção Expansão Quando não usar!

Mapeamento Associação de cada objeto de um tipo a uma chave, permitindo a indexação. Ex: String Inteiro Algoritmos Hashing Árvore 253 54 784 Útil para construir estruturas de armazenamento com custo reduzido em tempo (acesso direto).

Mapeamento Ex: Tabuleiro de Jogo da Velha O X X O X O = 0 = 1 = 2 X O O X 0 1 0 2 0 2 1 0 0 0 1 2 3 4 5 6 7 8 = 1 x 3 1 + 2 x 3 3 + 2 x 3 5 + 1 x 3 6 = 3 + 54 + 486 + 729 = 1272

Mapeamento Cada tabuleiro é mapeado em um valor único, entre 0 e 19682. Deste modo, é possível recuperar o tabuleiro a partir de sua chave. Através da chave, podemos indexar os objetos, por exemplo, em um array, caso o tamanho seja suficiente: 0 1 2 3 4 5 6... 19681 19682 X O X X X O X O X O O O O O O O O O O O O O O O O O

Hashing Entretanto, se o número de chaves possíveis for muito grande, é preciso distribuir os valores possíveis entre as posições disponíveis (de 0 a length-1). Esta técnica é chamada de hashing, e função de mapeamento chave-posição é a função hash. Ex: uma função hash simples é tirar o resto da divisão pelo tamanho da tabela h(chave) = chave % array.length

Por que usar Hashing? Estruturas de busca sequencial levam tempo até encontrar o elemento desejado. Ex: Arrays e listas Ex: Árvores 5 2 6 1 7 8 4 9 2 8 9 5 2 6 1 4 1 6 4

Por que usar Hashing? Em algumas aplicações, é necessário obter o valor com poucas comparações, logo, é preciso saber a posição em que o elemento se encontra, sem precisar varrer todas as chaves. A estrutura com tal propriedade é chamada de tabela hash. 20 % 8 = 4 45 % 8 = 5 20? 0 1 2 3 4 5 6 7 64 11 20 7 45?

Colisões Devido ao fato de existirem mais chaves que posições, é comum que várias chaves sejam mapeadas na mesma posição. Quando isto ocorre, dizemos que houve uma colisão. Ex: 45 % 8 = 5 1256 % 15 = 11 21 % 8 = 5 356 % 15 = 11 93 % 8 = 5 506 % 15 = 11 O que fazer quando mais de um elemento for inserido na mesma posição de uma tabela hash?

Encadeamento Separado No encadeamento separado, a posição de inserção não muda, logo, todos devem ser inseridos na mesma posição, através de uma lista encadeada. 20 % 5 = 0 0 20 18 % 5 = 3 25 % 5 = 0 colisão com 20 1 2 3 4 18 25

Encadeamento Separado A tabela hash, neste caso, contém um array de listas: class TabelaHash { } Lista[] listas; public TabelaHash(int n) { listas = new Lista[n]; for (int i = 0; i < n; i++) listas[i] = new Lista(); }

Encadeamento Separado Quando uma chave for inserida, a função hash é aplicada, e ela é acrescentada à lista adequada: int hashcode(int chave) { return...; } // função hash void inserir(int chave) { } int i = hashcode(chave); listas[i].inserir(chave);

Encadeamento Separado A busca é feita do mesmo modo: calcula-se o valor da função hash para a chave, e a busca é feita na lista correspondente. Se o tamanho das listas variar muito, a busca pode se tornar ineficiente, pois a busca nas listas é seqüencial: 0 1 2 3 20 4 0 88 32 15 11 60

Encadeamento Separado Por esta razão, a função hash deve distribuir as chaves entre as posições uniformemente: 0 1 2 3 4 5 6 0 15 10 4 13 31 88 20 Se o tamanho da tabela for um número primo, há mais chances de ter uma melhor distribuição.

Endereçamento Aberto No endereçamento aberto, quando uma nova chave é mapeada para uma posição já ocupada, uma nova posição é indicada para esta chave. Com linear probing, a nova posição é incrementada até que uma posição vazia seja encontrada: 27 % 8 = 3 27? 0 1 2 3 4 5 6 7 64 11 20 27 7

Endereçamento Aberto A tabela hash, neste caso, contém um array de objetos, e posições vazias são indicadas por null. Neste caso, os objetos serão do tipo Integer: class TabelaHash { } Integer[] posicoes; public TabelaHash(int n) { posicoes = new Integer[n]; }

Endereçamento Aberto Linear Probing Na inserção, a função hash é calculada, e a posição incrementada, até que uma posição esteja livre: void inserir(int chave) { } int i = hashcode(chave); while (posicoes[i]!= null) i = (i + 1) % posicoes.length; posicoes[i] = new Integer(chave);

Endereçamento Aberto Linear Probing Valores: 52, 78, 48, 61, 81, 120, 79, 121, 92 Função: hash(k) = k % 13 Tamanho da tabela: 13 0 1 2 3 4 5 6 7 8 9 10 11 12 52 78 79 81 120 121 92 48 61 52 78 79 92 120 81 121 48 61

Endereçamento Aberto Double Hashing Outra política de endereçamento aberto é o chamado double hashing: ao invés de incrementar a posição de 1, uma função auxiliar é utilizada para calcular o incremento. Esta função também leva em conta o valor da chave. 27? Inc(27) = 27*4+7 = 115 H(27) = 27 % 8 = 3 (3 + 115) % 8 = 6 0 1 2 3 4 5 6 7 64 11 20 53 27 7

Endereçamento Aberto : Remoção Para fazer uma busca com endereçamento aberto, basta aplicar a função hash, e a função de incremento até que o elemento ou uma posição vazia sejam encontrados. Porém, quando um elemento é removido, a posição vazia pode ser encontrada antes, mesmo que o elemento pertença a tabela: 27? Não 64 11 20 27 7 Fim da busca? Sim Inserção do 27 Remoção do 20 Busca pelo 27

Endereçamento Aberto : Remoção Para contornar esta situação, mantemos um bit (ou um campo booleano) para indicar que um elemento foi removido daquela posição: 27? Não 64 11 20X 27 7 Fim da busca? Não Esta posição estaria livre para uma nova inserção, mas não seria tratada como vazia numa busca.

Endereçamento Aberto : Expansão Nesta política de hashing, há que chamamos de fator de carga (load factor). Ele indica a porcentagem de células da tabela hash que estão ocupadas, incluindo as que foram removidas. Quando este fator fica muito alto (ex: excede 50%), as operações na tabela passam a demorar mais, pois o número de colisões aumenta. 9? 64 1 X 11 X 9 7

Endereçamento Aberto : Expansão Quando isto ocorre, é necessário expandir o array que constitui a tabela, e reorganizar os elementos na nova tabela. Como podemos ver, o tamanho atual da tabela passa a ser um parâmetro da função hash. 34 40 X 11 95 Tamanho = 7 Tamanho = 13 40 95 34 11

Endereçamento Aberto : Expansão O momento de expandir a tabela pode variar: Quando não for possível inserir um elemento Quando metade da tabela estiver ocupada Quando o load factor atingir um valor escolhido A terceira opção é a mais comum, pois é um meio termo entre as outras duas.

Quando não usar Hashing? Muitas colisões diminuem muito o tempo de acesso e modificação de uma tabela hash. Para isso é necessário escolher bem: - a função hash - o tratamento de colisões - o tamanho da tabela Quando não for possível definir parâmetros eficientes, pode ser melhor utilizar árvores balanceadas (como AVL), em vez de tabelas hash.

Referências Gregory L. Heilemann: Data structures, algorithms, and object-oriented programming. McGraw-Hill, Computer Science Press, 1996. James F. Korsh & Leonard J. Garrett: Data Structures, Algorithms, and Program Style Using C. PWS-Kent, 1988. Cormen, T. T., Leiserson, C. E., and Rivest, R. L.: Introduction to Algorithms. MIT Press, 1990. Ellis Horowitz & Sartaj Sahni: Fundamentals of Data Structures. Computer Science Press, 1983.