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

Documentos relacionados
Algoritmos e Estruturas de Dados: Lista Duplamente Encadeada

Algoritmos e Estruturas de Dados: Heap

Algoritmos e Estruturas de Dados: Árvore Binária

Algoritmos e Estruturas de Dados: Árvore Binária de Busca

Algoritmos e Estruturas de Dados: Ordenação

Algoritmos e Estruturas de dados

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Listas Lineares. continuando...

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

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?

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

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

Listas Lineares Ordenadas

INF 1620 P3-29/06/04 Questão 1 Nome:

Listas (cont.) K&R: Capitulo 6. Lista Simplesmente Ligada IAED, 2012/2013. Conjunto de nós. Cada nó contém. head NULL. typedef struct node {

INF 1620 P4 11/12/06 Questão 1 Nome:

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

Hashing. Cormen Capítulo 11

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

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

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 ligadas/listas encadeadas

Transformação de Chave. (Hashing)

INF 1620 P4-01/07/08 Questão 1 Nome:

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

INF P3-23/06/07 Questão 1 Nome:

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

Professora Jeane Melo

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

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

Curso de Programação C em Ambientes Linux Aula 05

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

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

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

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

Ponteiros. Introdução

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

TABELAS HASH. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Transformação de Chave - Hashing

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

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

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

Estrutura de Dados Listas

EPs 1 e 2. EP2: veja. EP1: veja

Estruturas de Dados Tabelas de Espalhamento

i a[i]

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

INF 1620 P3-27/11/04 Questão 1 Nome:

Dicionários. Prof. César Melo

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

Ponteiros. Introdução e Alocação Dinâmica

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

INF 1620 P2-23/10/04 Questão 1 Nome:

HASHING Hashing Motivação - Acesso Direto:

Módulo 10 Listas Encadeadas

CES-11. Pilhas Definição Operações Filas. Operações Deques. Definição. Operações

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

INF 1620 P3-25/11/05 Questão 1 Nome:

HASHING HASHING 6/10/2008

Introdução aos Algoritmos e Estruturas de Dados. 2 o Teste - A

Estrutura de dados 1. Ponteiros

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

INSTITUTO SUPERIOR TÉCNICO Introdução aos Algoritmos e Estruturas de Dados

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

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

Algoritmos e Estruturas de Dados

Carlos Eduardo Batista. Centro de Informática - UFPB

Métodos Computacionais. Listas Encadeadas

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Endereçamento Aberto

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

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

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

Algoritmos de pesquisa. Tabelas de dispersão/hash

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

Programação Estruturada Prof. Rodrigo Hausen Agregados de Dados Heterogêneos (structs)

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

DAS5102 Fundamentos da Estrutura da Informação

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

INF 1620 P3-21/06/08 Questão 1 Nome:

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

AED 2002/2003 p.1/16. Tabelas de Dispersão. Funçoes de dispersão Encadeamento externo Procura linear Double hashing Eficiência da procura

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

Lista Encadeada (Linked List)

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)... árvores e grafos são não lineares!

Matrizes esparsas: definição

Transcrição:

Algoritmos e Estruturas de Dados: Tabela de Dispersão com Encadeamento Rômulo Silva de Oliveira Departamento de Automação e Sistemas DAS UFSC romulo@das.ufsc.br http://www.das.ufsc.br/~romulo Maio/011 1 Tabela de Dispersão com Encadeamento Introdução / Chave pode ser de qualquer tipo Número, String, etc Endereço é tipicamente um eiro Função hash tem Domínio: todos os valores possíveis para chave Imagem: todos os endereços possíveis do array hash( Ana ) retorna 3 0 1 3 Renata Maria José Ana Pedro Paulo dados da renata dados da maria dados do josé dados da ana dados do pedro dados do paulo Mastering Algorithms with C Kyle Loudon O Reilly, 1999 Livros de algoritmos e estruturas de dados em geral Referências Tabela de Dispersão com Encadeamento Introdução 3/ Problema: Conjunto das chaves possíveis é muito maior que o conjunto dos endereços válidos Exemplo: uma palavra com 8 letras gera 6 8 possíveis combinações Mais que 10 11 possibilidades Um nome com 30 letras gera 6 30 possíveis combinações O número de endereços válidos está associado com o tamanho do array Exemplo: Empresa tem 100 funcionários Array com tamanho 100 será usado Mas existem 6 30 nomes possíveis Quando duas chaves mapeiam para o mesmo endere ço: COLISÃO Objetivo da função hash é minimizar colisões Tabela de Dispersão com Encadeamento Introdução 1/ Cada elemento composto por chave+dados Chave é a parte dos dados usada para localizar o elemento Exemplo: Nome do funcionário em seu registro Elementos são armazenados em um array Como localizar o elemento com a chave procurada? Tabela de Dispersão com Encadeamento Introdução / Forma possível para tratar colisões: Usar um array de listas encadeadas Cada lista recebe todos os elementos cuja chave resultou no mesmo valor de hash Inserção: Aplica a hash e coloca na frente da lista apropriada Consulta/Remoção: Aplica a hash e percorre a lista apropriada Função de dispersão ( Função hash) Mapeia valor de chave em endereço do array 0 1 3 Renata Maria José Ana Pedro dados da renata dados da maria dados do josé dados da ana dados do pedro Paulo dados do paulo 3 6

Tabela de Dispersão com Encadeamento Introdução / Número excessivo de colisões faz a tabela hash perder desempenho Objetivo é distribuir os elementos por toda a tabela Ideal seria ter um elemento por entrada da tabela Fator de Carga (load factor): = N / M N é o número de elementos na tabela M é o número de entradas na tabela Com hash uniforme e 1 temos no máximo 1 elemento por entrada 1 elemento por lista encadeada Bom chute: = 0.7 Método da Multiplicação Multiplica por constante entre 0 e 1 Pega a parte fracionária Multiplica por M Hash(k) = floor[ M ( (k A) % 1 ) ] A 0,618 Função Hash 3/ O tamanho da tabela não é tão crítico como no método da divisão Não precisa ser primo Livre para escolher a vontade o fator de carga (o M é consequência) 7 10 Uma boa função hash espalha os elementos uniformemente e aleatoriamente pela tabela Função Hash 1/ Informações qualitativas sobre as chaves ajuda a escolher uma boa função hash Exemplo: número de matrícula do tipo 13-011/1 8 hashpjw(const void *key) { const char *ptr; val; val = 0; ptr = key; while (*ptr!= '\0') { tmp; val = (val << ) + (*ptr); if (tmp = (val & 0xf0000000)) { val = val ^ (tmp >> ); val = val ^ tmp; ptr++; return val % PRIME_TBLSIZ; Função Hash / 11 Método da divisão Simples, popular, eficaz Hash(k) = k % M M é o número de entradas na tabela M é escolhido entre os números primos longe de potência de Exemplo: N = 00 M = 1699 M é primo entre 10 e 11 = 00 / 1699,6 Teremos a 3 elementos por lista encadeada Função Hash / 9 Tabela Hash com Encadeamento Interface 1/6 chtbl_init chtbl_init(chtbl *htbl, buckets, (*h)(const void *key), (*match)(const void *key1, const void *key), void (*destroy)(void *data)); 0 se a inicialização da tabela hash teve sucesso, ou -1 caso contrário. Inicializa a tabela hash encadeada especificada por htbl. Esta operação deve ser chamada para a tabela hash encadeada antes que a tabela hash seja usada em qualquer outra operação. O número de entradas (buckets) alocados para a tabela é especificado por buckets. O poer para função h especifica a função hash definida pelo usuário a ser usada. O poer para função match especifica a função definida pelo usuário que determina se duas chaves combinam ou não. Ela deve retornar 1 se key1 é igual a key, e 0 caso contrário. O argumento destroy provê uma maneira de liberar dados alocados dinamicamente quando chtbl_destroy é chamada. Por exemplo, se a tabela hash contem dados dinamicamente alocados via malloc, destroy deveria ser associada com free para liberar os dados quando a tabela hash for destruida. Para dados estruturados contendo vários membros alocados dinamicamente, destroy deveria estar associada com uma função definida pelo usuário que chama free para cada membro alocado dinamicamente e para a estrutura ela própria. Para uma tabela hash contendo dados que não devem ser liberados, destroy deve ser NULL. 1

chtbl_destroy Tabela Hash com Encadeamento Interface /6 void chtbl_destroy(chtbl *htbl); Nenhum. Destrói a tabela hash encadeada especificada por htbl. Nenhuma outra operação é permitida após a chamada de chtbl_destroy a não ser que chtbl_init seja chamada novamente. A operação chtbl_destroy remove todos os elementos da tabela hash e chama a função passada como destroy para chtbl_init uma vez para cada elemento quando o mesmo é removido, desde que destroy não seja NULL. chtbl_lookup Tabela Hash com Encadeamento Interface /6 chtbl_lookup(const CHTbl *htbl, void **data); 0 se o elemento for encontrado na tabela hash, ou -1 caso contr ário. Determina se um elemento combina com dados na tabela hash encadeada especificada por htbl. Se um elemento for encontrado, ap ós o retorno data aponta para os dados encontrados na tabela hash. 13 16 chtbl_insert Tabela Hash com Encadeamento Interface 3/6 chtbl_insert(chtbl *htbl, const void *data); 0 se a inserção do elemento teve sucesso, 1 se o elemento j á está na tabela hash, ou -1 caso contrário. Insere um elemento em uma tabela hash encadeada especificada por htbl. O novo elemento contem um poer para data, logo a memória referenciada por data deve permanecer válida pelo tempo que o elemento permanecer na tabela hash. É responsabilidade do chamador gerenciar a mem ória associada com os dados. chtbl_size chtbl_size(chtbl *htbl); Tabela Hash com Encadeamento Interface 6/6 Número de elementos na tabela hash. Macro que obtem o número de elementos na tabela hash encadeada especificada por htbl. 1 17 chtbl_remove Tabela Hash com Encadeamento Interface /6 chtbl_remove(chtbl *htbl, void **data); 0 se a remoção do elemento teve sucesso, ou -1 caso contrário. Remove o elemento correspondente aos dados indicados por data da tabela hash encadeada especificada por htbl. Após o retorno, data aponta para os dados armazenados no elemento que foi removido. É responsabilidade do chamador gerenciar a memória associada com os dados. #ifndef CHTBL_H #define CHTBL_H #include <stdlib.h> #include "list.h" typedef struct CHTbl_ { void buckets; Tabela Hash com Encadeamento Header 1/ (*h)(const void *key); (*match)(const void *key1, const void *key); (*destroy)(void *data); List size; *table; CHTbl; 1 18

Tabela Hash com Encadeamento Header 1/ chtbl_init(chtbl *htbl, buckets, (*h)(const void *key), (*match)(const void *key1, const void *key), void (*destroy)(void *data)); void chtbl_destroy(chtbl *htbl); chtbl_insert(chtbl *htbl, const void *data); chtbl_remove(chtbl *htbl, void **data); chtbl_lookup(const CHTbl *htbl, void **data); #define chtbl_size(htbl) ((htbl)->size) #endif 19 Tabela Hash com Encadeamento Implementação 3/6 void chtbl_destroy(chtbl *htbl) { i; for (i = 0; i < htbl->buckets; i++) { list_destroy(&htbl->table[i]); free(htbl->table); memset(htbl, 0, sizeof(chtbl)); return; Tabela Hash com Encadeamento Implementação 1/6 #include <stdlib.h> #include <string.h> #include "list.h" #include "chtbl.h" Tabela Hash com Encadeamento Implementação /6 chtbl_insert(chtbl *htbl, const void *data) { void *temp; bucket, retval; temp = (void *)data; if (chtbl_lookup(htbl, &temp) == 0) return 1; bucket = htbl->h(data) % htbl->buckets; if ((retval = list_ins_next(&htbl->table[bucket], NULL, data)) == 0) htbl->size++; return retval; 0 3 Tabela Hash com Encadeamento Implementação /6 chtbl_init(chtbl *htbl, buckets, (*h)(const void *key), (*match)(const void *key1, const void *key), void (*destroy)(void*data)) { i; if ((htbl->table = (List *)malloc(buckets * sizeof(list))) == NULL) htbl->buckets = buckets; for (i = 0; i < htbl->buckets; i++) list_init(&htbl->table[i], destroy); htbl->h = h; htbl->match = match; htbl->destroy = destroy; htbl->size = 0; 1 Tabela Hash com Encadeamento Implementação /6 chtbl_remove(chtbl *htbl, void **data) { ListElmt *element, *prev; bucket; bucket = htbl->h(*data) % htbl->buckets; prev = NULL; for (element = list_head(&htbl->table[bucket]); element!= NULL; element = list_next(element)) { if ( htbl->match(*data, list_data(element) ) ) { if (list_rem_next(&htbl->table[bucket], prev, data) == 0) { htbl->size--; else { prev = element;

Tabela Hash com Encadeamento Implementação 6/6 chtbl_lookup(const CHTbl *htbl, void **data) { ListElmt *element; bucket; bucket = htbl->h(*data) % htbl->buckets; for (element = list_head(&htbl->table[bucket]); element!= NULL; element = list_next(element)) { if (htbl->match(*data, list_data(element))) { *data = list_data(element); Tabela Hash com Encadeamento Sumário Estrutura de dados simples e extremamente eficiente Permite pesquisa rápida em grandes volumes de dados Requer cuidado com a função hash usada Não permite caminhamento ordenado sobre os dados Árvores permitem isto Utilizada nas mais diversas situações 6