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

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

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

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

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

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

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

HASHING HASHING 6/10/2008

TABELAS HASH. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

UNIVERSIDADE DA BEIRA INTERIOR

Matemática Discreta 12

Tabelas de dispersão/hash

HASHING Hashing Motivação - Acesso Direto:

Pesquisa em Memória Primária Hashing

Hashing: conceitos. Hashing

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

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

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

UNIVERSIDADE DA BEIRA INTERIOR

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

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

Algoritmos de pesquisa. Tabelas de dispersão/hash

i a[i]

As Listas são simples de se implementar, mas, com um tempo médio de acesso T = n/2, tornando-se impraticáveis para grandes quantidades de dados.

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?

UNIVERSIDADE DA BEIRA INTERIOR

TABELAS DE DISPERSÃO/HASH

Dicionários. Prof. César Melo

Métodos de Busca Parte 2

Endereçamento Aberto

UNIVERSIDADE DA BEIRA INTERIOR

Tabelas de Espalhamento (hash)

Hashing (Tabela de Dispersão)

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

Complexidade de Algoritmos

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

Transformação de Chave. (Hashing)

UNIVERSIDADE DA BEIRA INTERIOR

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

Hashing. Prof. Josenildo Silva IFMA 2014

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

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

Estruturas de Dados Tabelas de Espalhamento

Transformação de Chave - Hashing

Dicionários. TAD Orientado a conteúdo

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

Listas Lineares Ordenadas

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

BCC202 - Estrutura de Dados I

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

UNIVERSIDADE DA BEIRA INTERIOR

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

Carlos Eduardo Batista. Centro de Informática - UFPB

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

Pesquisa Linear. Adriano J. Holanda 15/3/2016

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

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

Hashing convencional...

Universidade de São Paulo

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

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

ESTRUTURA DE DADOS E ALGORITMOS. Hashing (Tabela de Dispersão) Cristina Boeres

Hashing. Hashing. Hashing versus Indexação. Hashing. Hashing convencional... Exemplo de espalhamento. Revisão...

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

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

Copiar para o ficheiro ArvoreBinaria.h e adaptar as funções associadas às operações sobre árvores binárias (3.1 a 3.12)

Árvores Binárias de Busca

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

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

UNIVERSIDADE DA BEIRA INTERIOR

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.

LISTAS LINEARES. Estrutura de Dados

Introdução Métodos de Busca Parte 1

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

Árvores Binárias de Busca

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

DAINF - Departamento de Informática

indexação e hashing Construção de Índices e Funções Hash Diego Gomes Tomé - MSc. Informática Orientador: Prof. Dr. Eduardo Almeida October 13, 2016

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

Filas de Prioridade & Heaps

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

Métodos de Busca Parte 1

Árvores de Pesquisa (Parte II)

SCC Capítulo 5 Métodos de Busca [3]

Aula 30: Tabelas de dispersão. Conceitos e princípios de funcionamento

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Tabela Hash. Prof. Msc. Mariella Berger

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

INF 1620 P2-01/11/03 Questão 1 Nome:

ANÁLISE E PROJETO DE BANCO DE DADOS

Aula 15: Pesquisa em Memória Primária. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Tabelas de Hash MBB. Novembro de Algoritmos e Complexidade LEI-LCC

Redimensionamento de Tabelas. Classificação e Pesquisa de Dados. Realocação Local. Como Redimensionar. Hashing Dinâmico. Realocação Local (Cont.

max1: 20,max2:+ max1:15, max2:20 max1:30,max2:32,max3:35 max1:40,max2:+

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

Módulo 18 - Tabelas de Dispersão. Referências

UNIVERSIDADE DE SÃO PAULO - ICMC Departamento de Ciências da Computação SCC-203 Algoritmos e Estruturas de Dados 2-2 Sem /2012 Profa.

Transcrição:

Tabelas de hash Acabamos de estudar como implementar uma tabela hashing aberta e estudaremos agora como implementar uma tabela hashing fechada ou também denominada de tabela hashing com endereçamento aberto. Neste tipo de implementação, a tabela hash é um vetor com m posições. Todas as chaves são armazenadas na própria tabela sem a necessidade de espaços extras ou ponteiros. Este método é aplicado quando o número de chaves a serem armazenadas é reduzido e as posições vazias na tabela são usadas para o tratamento de colisões. 188

Tabelas de hash Quando uma chave x é endereçada na posição h(x) e esta já está ocupada, outras posições vazias na tabela são procuradas para armazenar x. Caso nenhuma seja encontrada, a tabela está totalmente preenchida e x não pode ser armazenada. Veremos duas maneiras de efetuar a busca por uma posição livre para armazenar x: tentativa linear e tentativa quadrática. 189

Tabelas de hash fechada tentativa linear Na tentativa linear, quando uma chave x deve ser inserida e ocorre uma colisão, a seguinte função é utilizada: h (x) = (h(x)+j) mod m para 1 j m-1, sendo que h(x) = x mod m O objetivo é armazenar a chave no endereço consecutivo h(x)+1, h(x)+2,, até encontrar uma posição vazia. 190

Tabelas de hash fechada tentativa linear A operação de remoção é delicada, não se pode remover de fato uma chave do endereço, pois haveria perda da seqüência de tentativas. Com isso, cada endereço da tabela é marcado como livre (L), ocupado (O) ou removido (R). Livre quando a posição ainda não foi usada, ocupado quando uma chave está armazenada, e removido quando armazena uma chave que já foi removida. Para uma compreensão adequada do 191processo, analisaremos um exemplo.

Tabelas de hash fechada tentativa linear Visando manter um paralelo com o método usado anteriormente também nos utilizaremos de uma tabela com 8 entradas. Inicialmente temos: Índice Situação Chave Inserir chave 16 Índice Situação Chave 0 L 1 L 2 L 3 L 4 L 5 L 16%8=0 0 O 16 1 L 2 L 3 L 4 L 5 L 192 7 L 7 L

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 L 2 L 3 L 4 L 5 L 7 L Inserir chave 23 Índice Situação Chave 23%8=7 0 O 16 1 L 2 L 3 L 4 L 5 L 7 O 23 193

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 L 2 L 3 L 4 L 5 L 7 O 23 Inserir chave 41 Índice Situação Chave 41%8=1 0 O 16 1 O 41 2 L 3 L 4 L 5 L 7 O 23 194

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 O 41 2 L 3 L 4 L 5 L 7 O 23 Inserir chave 25 Índice Situação Chave 25%8=1 0 O 16 (1+1)%8=2 1 O 41 2 O 25 3 L 4 L 5 L 7 O 23 195

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 O 41 2 O 25 3 L 4 L 5 L 7 O 23 Inserir chave 39 Índice Situação Chave 39%8=7 0 O 16 (7+1)%8=0 1 O 41 (7+2)%8=1 2 O 25 (7+3)%8=2 3 O 39 (7+4)%8=3 4 L 5 L 7 O 23 196

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 O 41 2 O 25 3 O 39 4 L 5 L 7 O 23 Remover chave 41 Índice Situação Chave 41%8=1 0 O 16 1 R 41 2 O 25 3 O 39 4 L 5 L 7 O 23 197

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 R 41 2 O 25 3 O 39 4 L 5 L 7 O 23 Remover chave 23 Índice Situação Chave 23%8=7 0 O 16 1 R 41 2 O 25 3 O 39 4 L 5 L 7 R 23 198

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 R 41 2 O 25 3 O 39 4 L 5 L 7 R 23 Remover chave 25 Índice Situação Chave 25%8=1 0 O 16 (1+1)%8=2 1 R 41 2 R 25 3 O 39 4 L 5 L 7 R 23 199

Tabelas de hash fechada tentativa linear Índice Situação Chave 0 O 16 1 R 41 2 R 25 3 O 39 4 L 5 L 7 R 23 Inserir chave 34 Índice Situação Chave 34%8=2 0 O 16 1 R 41 2 O 34 3 O 39 4 L 5 L 7 R 23 200

201 Com base no que foi apresentado defina a(s) estrutura(s) de dados necessária(s) para a implementação de uma tabela hashing fechada com tentativa linear. #define tam 8 typedef struct { int chave; char livre; /* L = livre, O = ocupado, R = removido*/ }Hash; Tabelas de hash fechada: Exercício typedef Hash Tabela[tam];

202 Tabelas de hash fechada: Exercício Agora, implemente a função de inserção de uma chave na tabela hashing fechada em questão. void inserir(tabela tabela, int n) { int i=0; int pos = funcaohashing(n); while (i < tam && tabela[(pos+i)%tam].livre!='l' && tabela[(pos+i)%tam].livre!='r') i = i+1; if (i < tam) { tabela[(pos+i)%tam].chave = n; tabela[(pos+i)%tam].livre ='O'; }else printf ("\ntabela cheia!"); }

Tabelas de hash fechada: Exercício int funcaohashing(int num) { return num % tam; } 203

Tabelas de hash fechada: Exercício Implemente a função de remoção de uma chave na tabela hashing fechada em questão. void remover(tabela tabela, int n) { int posicao = buscar(tabela, n); if (posicao < tam) tabela[posicao].livre = 'R'; else printf ("\nelemento nao esta presente."); } 204

Tabelas de hash fechada: Exercício int buscar(tabela tabela, int n) { int i=0; int pos=funcaohashing(n); while(i < tam && tabela[(pos+i)%tam].livre!= 'L' && tabela[(pos+i)%tam].chave!= n) i = i+1; if (tabela[(pos+i)%tam].chave == n && tabela[(pos+i)%tam].livre == 'O') return (pos+i)%tam; else return tam; // não encontrado } 205

Para uma melhor fixação do tópico em estudo com base na definição do TAD abaixo implemente suas funções ainda não definidas (fazer em casa). #define tam 8 typedef struct { int chave; char livre; // L = livre, O = ocupado, R = removido }Hash; typedef Hash TabelaHash [tam]; void inicializarhash(tabelahash *); int funcaohashing(int); void mostrarhash(tabelahash); void inserirchave(tabelahash, int); int buscarchave(tabelahash, int); void removerchave(tabelahash, int); Tabelas de hash fechada: Exercício 206

Tabelas de hash fechada tentativa quadrática Na tentativa linear as chaves que colidem geram os chamados agrupamentos primários, o que aumenta o tempo de busca. Agora estudaremos a tentativa quadrática. Neste tipo de tentativa, outro tipo de agrupamento também é gerado, denominado agrupamento secundário, mas as degradações sãs reduzidas se comparadas com a tentativa linear. 207

Tabelas de hash fechada tentativa quadrática Segundo Szwarcfiter (1994), para a aplicação deste método os endereços calculados pela função de hashing h (x, k) devem corresponder à varredura de toda tabela, para k=0,..., m-1. As equações recorrentes abaixo fornecem uma maneira de calcular os endereços diretamente. h (x, 0) = h(x) h (x, k) = (h (x, k-1)+k) mod m para 1 k m-1, sendo que h(x) = x mod m 208

Tabelas de hash fechada tentativa quadrática Para uma melhor compreensão analisaremos agora um exemplo, também nos utilizaremos de uma tabela com 8 entradas. Inicialmente temos: Índice Situação Chave Inserir chave 12 Índice Situação Chave 0 L 1 L 2 L 3 L 4 L 5 L 12%8=4 0 L 1 L 2 L 3 L 4 O 12 5 L 209 7 L 7 L

Tabelas de hash fechada tentativa quadrática Índice Situação Chave 0 L 1 L 2 L 3 L 4 O 12 5 L 7 L Inserir chave 20 Índice Situação Chave 20%8=4 0 L (4+1) mod 8=5 1 L 2 L 3 L 4 O 12 5 O 20 7 L 210

Tabelas de hash fechada tentativa quadrática Índice Situação Chave 0 L 1 L 2 L 3 L 4 O 12 5 O 20 7 L Inserir chave 28 Índice Situação Chave 28%8=4 0 L (4+1) mod 8=5 1 L (5+2) mod 8=7 2 L 3 L 4 O 12 5 O 20 7 O 28 211

Tabelas de hash fechada tentativa quadrática Índice Situação Chave 0 L 1 L 2 L 3 L 4 O 12 5 O 20 7 O 28 Inserir chave 36 Índice Situação Chave 36%8=4 0 L (4+1) mod 8=5 1 L (5+2) mod 8=7 2 O 36 (7+3) mod 8=2 3 L 4 O 12 5 O 20 7 O 28 212

Tabelas de hash fechada tentativa quadrática Índice Situação Chave 0 L 1 L 2 O 36 3 L 4 O 12 5 O 20 7 O 28 Remover chave 12 Índice Situação Chave 12%8=4 0 L 1 L 2 O 36 3 L 4 R 12 5 O 20 7 O 28 213

Tabelas de hash fechada tentativa quadrática Índice Situação Chave 0 L 1 L 2 O 36 3 L 4 R 12 5 O 20 7 O 28 Remover chave 20 Índice Situação Chave 20%8=4 0 L (4+1)%8=5 1 L 2 O 36 3 L 4 R 12 5 R 20 7 O 28 214

Tabelas de hash fechada tentativa quadrática Índice Situação Chave 0 L 1 L 2 O 36 3 L 4 R 12 5 R 20 7 O 28 Inserir chave 44 Índice Situação Chave 44%8=4 0 L 1 L 2 O 36 3 L 4 O 44 5 R 20 7 O 28 215

216 Com base no que foi apresentado defina a(s) estrutura(s) de dados necessária(s) para a implementação de uma tabela hashing fechada com tentativa quadrática. #define tam 8 typedef struct { int chave; char livre; /* L = livre, O = ocupado, R = removido*/ }Hash; Tabelas de hash fechada: Exercício typedef Hash Tabela[tam];

Tabelas de hash fechada: Exercício Agora, implemente a função de inserção de uma chave na tabela hashing fechada em questão. void inserirchave (Tabela tabela, int n) { int pos = funcaohashing(n); int k=1; while(k < tam && tabela[pos].livre!= 'L' && tabela[pos].livre!= 'R') { pos = (pos+k)%tam; k = k+1; } 217

Tabelas de hash fechada: Exercício } if(k < tam) { tabela[pos].chave = n; tabela[pos].livre ='O'; } else printf("\ntabela cheia ou em loop!"); int funcaohashing(int num) { return num % tam; } 218

Tabelas de hash fechada: Exercício Implemente a função de remoção de uma chave na tabela hashing fechada em questão. void removerchave(tabela tabela, int n) { int posicao = buscarchave (tabela, n); if (posicao < tam) tabela[posicao].livre = 'R'; else printf("\nelemento nao estah presente."); } 219

int buscarchave(tabela tabela, int n) { int pos = funcaohashing(n); int k=1; while(k <= tam && tabela[pos].livre!='l'&& tabela[pos].chave!= n) { pos = (pos+k)%tam; k = k+1; } if(tabela[pos].chave == n && tabela[pos].livre =='O') return pos; else return tam; } 220

Para uma melhor fixação do tópico em estudo com base na definição do TAD abaixo implemente suas funções ainda não definidas (fazer em casa). #define tam 8 typedef struct { int chave; char livre; /* L = livre, O = ocupado, R = removido*/ }Hash; typedef Hash Tabela[tam]; int funcaohashing(int); void inicializartabela(tabela); void mostrarhash(tabela); void inserirchave (Tabela, int); int buscarchave(tabela, int); void removerchave(tabela, int); Tabelas de hash fechada: Exercício 221

Função hashing Antes de finalizarmos nosso estudo sobre tabelas hashing cabe destacar que uma função hashing: Possui o objetivo de transformar o valor de chave de um elemento de dados em uma posição para este elemento em um dos b subconjuntos definidos. É um mapeamento de K -> {1,..,b}, onde K = {k 1,..,k m } é o conjunto de todos os valores de chave possíveis no universo de dados em questão. 222

223 Deve dividir o universo de chaves K = {k 1,..,k m } em b subconjuntos de mesmo tamanho. A probabilidade de uma chave k j K aleatória qualquer cair em um dos subconjuntos b i : i [1,b] deve ser uniforme. Se a função de Hashing não dividir K uniformemente entre os b i, a tabela de hashing pode degenerar. O pior caso de degeneração é aquele onde todas as chaves caem em um único conjunto b i. A função primeira letra do exemplo do slide 164 é um exemplo de uma função ruim. A letra do alfabeto com a qual um nome inicia não é distribuída uniformemente. Quantos nomes começam com X?

Funções de Hashing Até o momento utilizamos um exemplo simples porém muito utilizado de função hashing. Agora veremos outras técnicas utilizadas para implementar funções hashing que visão garantir a distribuição uniforme de um universo de chaves entre b conjuntos. Lembre-se: a função de hashing h(k j ) -> [1,b] recebe uma chave k j {k 1,..,k m } e devolve um número i, que representa o índice do subconjunto b i : i [1,b] onde o elemento possuidor dessa chave vai ser colocado. 224

Funções de Hashing As funções de hashing abordadas adiante supõem sempre uma chave simples, um único dado, seja string ou número, sobre o qual será efetuado o cálculo. Hashing sobre mais de uma chave, p.ex. Nome E CPF também é possível, mas implica em funções mais complexas. 225

Funções de Hashing: Meio do Quadrado Calculada em dois passos: Eleva-se a chave ao quadrado Utiliza-se um determinado número de dígitos ou bits do meio do resultado. Idéia geral: A parte central de um número elevado ao quadrado depende dele como um todo. Quando utilizamos diretamente bits: Se utilizarmos r bits do meio do quadrado, podemos utilizar o seu valor para acessar diretamente uma tabela de 2 r entradas. 226

Funções de Hashing: Folding ou Desdobramento Método para cadeias de caracteres Inspirado na idéia de se ter uma tira de papel e de se dobrar essa tira formando um bolinho ou sanfona. Baseia-se em uma representação numérica de uma cadeia de caracteres. Pode ser binária ou ASCII. Dois tipos: Shift Folding e Limit Folding. 227

228 Funções de Hashing: Shift Folding Dividi-se uma string em pedaços, onde cada pedaço é representado numericamente e soma-se as partes. Exemplo mais simples: somar o valor ASCII de todos os caracteres. O resultado é usado diretamente ou como chave para uma h (k) Exemplo: Suponha que os valores ASCII de uma string sejam os seguintes: 123, 203, 241, 112 e 20 O folding será: 123 + 203 + 241 + 112 + 20 = 699

Funções de Hashing: Limit Folding Usando a idéia de uma tira de papel como sanfona: Exemplo mais simples: somar o valor ASCII de todos os caracteres, invertendo os dígitos a cada segundo caracter. 123 203 241 112 20 229 Exemplo: Suponha que os valores ASCII de um string sejam os seguintes: 123, 203, 241, 112 e 20 O folding será: 123 + 302 + 241 + 211 + 20 = 897

Funções de Hashing: Análise de Freqüência Se estabelece uma função escolhendo quais dígitos entrarão como argumentos da função com base na sua probabilidade de ocorrência Tabula-se a ocorrência de cada caractere em cada posição (a partir de uma amostra) e escolhe-se as k posições que apresentam valores mais uniformemente distribuídos Desvantagem: deve conhecer boa amostra das chaves 230

231 Simplicidade Tabela hash: Vantagens É muito fácil de implementar um algoritmo para implementar hashing. Escalabilidade Podemos adequar o tamanho da tabela de hashing ao n esperado em nossa aplicação. Eficiência para n grandes Para trabalharmos com problemas envolvendo n = 1.000.000 de dados, podemos imaginar uma tabela de hashing com 2.000 entradas, onde temos uma divisão do espaço de busca da ordem de n/2.000 de imediato.

232 Tabela hash: Desvantagens Dependência da escolha de função de hashing Para que o tempo de acesso médio ideal T(n) = c1. (1/b).n + c2 seja mantido, é necessário que a função de hashing divida o universo dos dados de entrada em b conjuntos de tamanho aproximadamente igual. Tempo médio de acesso é ótimo somente em uma faixa Existe uma faixa de valores de n, determinada por b, onde o hashing será muito melhor do que uma árvore. Fora dessa faixa é pior.