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?

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

Endereçamento Aberto

Listas Lineares Ordenadas

Árvores Binárias de Busca

Tabelas de Espalhamento (hash)

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

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

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

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

Algoritmos de pesquisa. Tabelas de dispersão/hash

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

Tabelas de dispersão/hash

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

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

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

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

i a[i]

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

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

Árvores B. Hashing. Estrutura de Dados II Jairo Francisco de Souza

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

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

TABELAS HASH. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Filas. Nesta aula veremos o ADT fila Em um computador existem muitas filas esperando pela impressora, acesso ao disco ou, num sistema timesharing,

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

Métodos de Busca Parte 2

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

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

Matemática Discreta 12

Hashing: conceitos. Hashing

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

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

Complexidade de Algoritmos

Hashing. Cormen Capítulo 11

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

Árvores Binárias de Busca (ABB) 18/11

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof Márcio Bueno. / Material da Prof a Ana Eliza

Tabelas de Dispersão. Estrutura de Dados e Algoritmos

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

Árvores Binárias de Busca

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

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

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

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

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

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

Estruturas de Dados Tabelas de Espalhamento

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

Aula 05: Listas Encadeadas. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

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

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

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

Árvores Binárias de Busca (ABB) 18/11

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.

Hashing Endereçamento Direto Tabelas Hash

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

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

Pesquisa em Memória Primária Hashing

Introdução Métodos de Busca Parte 1

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Árvores de Pesquisa (Parte I)

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof a Karina Oliveira. Fonte: Prof a Ana Eliza

Listas Lineares. Algoritmos e Estruturas de Dados I. José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP

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

Universidade de São Paulo

Hashing Externo. SCC-503 Algoritmos e Estruturas de Dados II. Thiago A. S. Pardo M.C.F. de Oliveira Cristina Ciferri

Hashing. Prof. Josenildo Silva IFMA 2014

Hashing (Tabela de Dispersão)

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

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

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

Transformação de Chave. (Hashing)

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

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

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

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

Dicionários. TAD Orientado a conteúdo

Tabelas de dispersão

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Dicionários. Prof. César Melo

Programação de Computadores II. Cap. 17 Busca

Árvores Binárias de Busca

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Árvore Binária de Busca. Prof. César Melo

Lista de Exercícios 04

Fontes Bibliográficas. Listas Circulares. Função Imprime

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

Tabelas de Dispersão. Tabela de Dispersão

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Transcrição:

Tabelas Hash O Que é uma Tabela Hash? Nesta aula são discutidos modos de armazenar informações em um vetor, e depois procurar por uma informação Tabelas Hash constituem uma abordagem comum para o problema de armazenar e procurar dados Esta apresentação introduz a tabela hash A forma mais simples de tabelas hash é um vetor de registros. Este exemplo tem 701 registros. [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] Um vetor de registros [ 701] O Que é uma Tabela Hash? [ 5 ] O Que é uma Tabela Hash? [ 5 ] Cada registro tem um campo especial, chamado de chave. Neste exemplo, a chave é um campo de inteiro longo chamado Number. [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 701] O número deve ser um identificador para cada pessoa, e o resto do registro contém informações sobre a mesma. [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 701] O Que é uma Tabela Hash? Quando uma tabela hash está sendo usada, algumas células contêm registros válidos, e outras estão vazias. Para inserir um novo registro, a chave deve, de alguma maneira, ser convertida em um índice de vetor. O índice é chamado de valor hash da chave. 1

Maneira típica de se criar um valor hash: (Number % 701) + 1 Quanto é (580625685 % 701) + 1? Maneira típica de se criar um valor hash: (Number % 701) + 1 Quanto é (580625685 % 701) + 1? 4 O valor hash é usado para a localização do novo registro. O valor hash é usado para a localização do novo registro. 4 Aqui temos um novo registro a ser inserido, com um valor hash igual a 3. Isto é chamado de colisão, porque já há outro registro válido em [3]. Quando ocorrer uma colisão, mova-se pelo vetor até encontrar uma 2

Isto é chamado de colisão, porque já há outro registro válido em [3]. Quando ocorrer uma colisão, mova-se pelo vetor até encontrar uma Isto é chamado de colisão, porque já há outro registro válido em [3]. Quando ocorrer uma colisão, mova-se pelo vetor até encontrar uma Questão Isto é chamado de colisão, porque já há outro registro válido em [3]. O novo registro vai para a Onde você estaria nesta tabela, se não houver colisões? Use o número de seu R.G. ou um outro número de sua preferência. Os dados associados a uma chave podem ser localizados fácil e rapidamente. Calcule o valor hash. Confira a chave do elemento do vetor com a chave procurada. Não sou eu. 3

Continue movendo-se até encontrar a chave ou uma Continue movendo-se até encontrar a chave ou uma Não sou eu. Não sou eu. Continue movendo-se até encontrar a chave ou uma Quando o item é encontrado, a informação pode ser copiada para o local necessário. Sim! Sim! Removendo um Registro Registros podem também ser removidos da tabela hash. Removendo um Registro Registros podem também ser removidos da tabela hash. Mas o local não pode ser deixado como uma célula vazia ordinária, pois pode interferir nas buscas. Por favor, me remova. 4

Deletando um Registro Pseudo-Código Registros podem também ser removidos da tabela hash. Mas o local não pode ser deixado como uma célula vazia ordinária, pois pode interferir nas buscas. O local deve ser marcado de alguma maneira especial para que na busca possa-se saber que havia algo lá. int Hash-Insert Insert(T,k) // pré: tabela hash T[1..P], chave de busca k // pós: insere k em T, retornando posição de inserção // H(.,. ) função de mapeamento i = 0; do { h = H(k,i); if (T[h] está livre) { T[h] = k; return h; } else i = i + 1; } while (i!= P); cerr << Error: hash table overflow ; Pseudo-Código Fator de Carga int Hash-Search Search(T,k) // pré: tabela hash T[1..P], chave de busca k // pós: retorna posição onde k foi achada ou zero c.c. // H(.,. ) função de mapeamento i = 0; do { h = H(k,i); if (T[h].key == k.key) return h; else i = i + 1; } while (i!= P && T[h] não o está livre); return 0; // não encontrado Usualmente indicado por α (alpha) Definição: O número de elementos ocupados em uma tabela hash (n)) dividido pelo número total de elementos disponíveis (P)( Quanto maior o fator de carga, mais lento é o processo de recuperação Com endereçamento aberto, 0 <= α <= 1 Com endereçamento encadeado, freqüentemente α>1 Funções de Mapeamento Uma função hash de boa qualidade satisfaz (aproximadamente) à hipótese do hash uniforme simples: cada chave tem igual probabilidade de efetuar o mapeamento para qualquer uma das P posições da tabela, não importando a posição para onde foi feito o hash de qualquer outra chave Todavia, é raro conhecer a distribuição de probabilidade segundo a qual as chaves são obtidas Na prática podem ser usadas heurísticas para criar uma função hash que provavelmente terá um bom desempenho Endereçamento Aberto: método de solucionar colisões no qual todos os elementos são armazenados dentro da própria tabela hash Encadeado: colisões são mantidas em uma estrutura de dados separada (por exemplo, uma lista linear) Funções de Mapeamento Endereçamento Aberto P é um número primo, não próximo a uma potência de 2 Mapeamento simples H(k) = k % P (intervalo 0 até P-1) P H(k) = k % P + 1 (intervalo 1 até P) Sondagem Linear (0 <= i <= P-1) P H(k,i) = (H(k) + i) % P Sondagem Quadrática H(k,i) = (H(k) + i 2 ) % P H(k,i) = (H(k) + c 1 *i + c 2 *i 2 ) % P (c 1,c 2 constantes) Hash duplo H(k,i) = (H( 1 (k) + i*h 2 (k)) % P 5

Endereçamento Aberto Endereçamento Encadeado Vimos que α = n/p,, e 0 <= α <= 1 neste caso Quando n e P tendem a infinito, o número médio de sondagens em uma busca malsucedida é no máximo 1/(1-α), para hash uniforme Idem para inserção U (universo de chaves) K (chaves reais) k 1 k 4 k 3 k 2 k 5 k 1 k 4 k 3 k 2 k 5 Endereçamento Encadeado Endereçamento Encadeado No encadeamento, todos os elementos que efetuam hash para um mesmo valor são colocados em uma lista linear A posição T[h] ] contém um ponteiro para o início da lista de todos os elementos armazenados que efetuam hash para h Se não houver nenhum desses elementos, a posição T[h] ] conterá NULL (ou NIL ou qualquer valor que indique término da lista) Tempos no pior caso Inserção: O(1) Busca: tempo proporcional ao tamanho da lista Remoção: O(1) se as listas forem duplamente encadeadas; se não for, tempo proporcional ao tamanho da lista Busca no caso médio: O(1+α), sob a hipótese de hash uniforme simples Interpretação de Chaves como Números Naturais A maioria das funções hash assume que o universo de chaves é o conjunto N = {0, 1, 2,...} de números naturais Se as chaves não são números naturais, deve-se encontrar um modo de interpretá-las como números naturais em notação de base apropriada Por exemplo pt poderia ser interpretado como o par de inteiros (112, 116), pois p =112 e t =116 no conjunto de caracteres ASCII Expresso como um inteiro de base 128, pt se torna (112*128)+116 = 14452 Exemplo de Transformação de Chave String para Inteiro int Transform(string s) // pré: s chave a ser transformada // pós: retorna s convertida para um número // natural // BASE = 128 (ASCII) ou 256 (ASCII Estendido) k = 0; for(i=0 i=0; i<s.length(); i++) i k = (k * BASE + s[i]) % P; return k; 6

Especificação para uma Tabela Hash Operações de Criação/Destruição Operações: Criação Destruição Status Operações Básicas Outras Operações Criação void Create(HashTable pré-condição: nenhuma pós-condição: tabela hash T é criada e iniciada como vazia Destruição void Destroy(HashTable pré-condição: tabela hash T já tenha sido criada pós-condição: tabela T é destruída Operações de Status Vazia bool Empty(HashTable pré-condição: tabela hash já tenha sido criada pós-condição: função retorna true se a tabela hash está vazia; false caso contrário Cheia bool Full(HashTable pré-condição: tabela hash já tenha sido criada pós-condição: função retorna true se a tabela hash está cheia; false caso contrário Fator de Carga float LoadFactor(HashTable pré-condição: tabela hash já tenha sido criada pós-condição: função retorna o fator de carga da tabela hash O tipo HashEntry depende da aplicação e pode variar desde um simples caracter ou número até uma struct ou class com muitos campos. Inserção int Insert(HashTable &T, HashEntry k) pré-condição: tabela T já tenha sido criada e não está cheia pós-condição: O item k é inserido na tabela, retornando a posição onde k foi inserido Busca int Search(HashTable &T, HashEntry k) pré-condição: tabela T já tenha sido criada pós-condição: retorna a posição onde k se encontra ou zero caso contrário Remoção bool Delete(HashTable &T, HashEntry k) pré-condição: tabela T já tenha sido criada pós-condição: O item k é removido, retornando true se k estava na tabela e false caso contrário Operações Básicas Outras Operações Desempenho Limpeza void Clear(HashTable pré-condição: tabela já tenha sido criada pós-condição: todos os itens da tabela são descartados e ela torna-se uma tabela hash vazia Tamanho int Size(HashTable pré-condição: tabela já tenha sido criada pós-condição: função retorna o número de elementos em uso na tabela hash log(número Médio de Comparações) 100 10 End. Encadeado Sondagem Linear Hash duplo Busca com Sucesso 1 0.1 0.25 0.5 0.75 0.9 0.99 Fator de Carga 7

Desempenho Desempenho log(número Médio de Comparações) 10000 1000 100 10 1 Busca sem Sucesso End. Encadeado Sondagem Linear Hash duplo 0.1 0.25 0.5 0.75 0.9 0.99 Por exemplo, se há 4096 nós em uma ABBB, toma-se em média 12.25 comparações para completar uma busca com sucesso Usando uma tabela hash,, com α < 0.5, serão necessárias 1.39 comparações em média Busca Inserção Remoção Vetor Ordenado O(log n) O(n) O(n) Árvore B.B.B. O(log n) O(n log n) O(log n) Tabela Hash O(1) O(1) O(1) 0.1 Fator de Carga Sumário Tabelas hash armazenam uma coleção de registros com chaves O local de um novo registro depende do valor hash de sua chave Quando ocorre uma colisão, é usado o próximo local disponível Procurar por uma chave é, geralmente, rápido. Quando um item é removido, o local deve ser marcado de maneira especial, para que na busca se saiba que a célula já foi utilizada 8