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.

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

Tabelas de dispersão

Algoritmos e Estruturas de Dados 2005/2006

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

Listas Lineares Ordenadas

Árvores Binárias de Busca

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

Hashing (Tabela de Dispersão)

Transformação de Chave. (Hashing)

Algoritmos e Estruturas de Dados 2008/2009

Algoritmos de pesquisa. Tabelas de dispersão/hash

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

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

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

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

Tabelas de dispersão/hash

Transformação de Chave - Hashing

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?

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

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

Tabelas de Dispersão. Estrutura de Dados e Algoritmos

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

Dicionários. Prof. César Melo

Hashing: conceitos. Hashing

i a[i]

Matemática Discreta 12

Pesquisa em Memória Primária Hashing

Hashing. Cormen Capítulo 11

TABELAS DE DISPERSÃO/HASH

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.

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

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

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

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

Tabelas de Espalhamento (hash)

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

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

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

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

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

Tabelas Hash Endereçamento Direto

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

UNIVERSIDADE DA BEIRA INTERIOR

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

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

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

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

TABELAS HASH. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Árvores de Pesquisa (Parte I)

Fila e Deque. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Árvores Binárias de Busca

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

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

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

AED2 - Aula 04 Vetores ordenados e árvores de busca

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

Aula 08. Estruturas de dados Árvore e Grafo

Matrizes esparsas: definição

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

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

Pesquisa em Memória Primária Árvores de Busca. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

DAINF - Departamento de Informática

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

Aula 16: Pesquisa em Memória Primária - Árvores de Busca. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Árvore B. Uma Árvore B de ordem m éumaárvore,talque: Cada nó contém no máximo m

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

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

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

Estruturas de Dados Aula 11: TAD Pilha

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

Estruturas de Dados Tabelas de Espalhamento

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

Matrizes Esparsas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

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

Árvores de Pesquisa (Parte II)

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

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

Dicionários. TAD Orientado a conteúdo

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

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

Hashing Endereçamento Direto Tabelas Hash

AED2 - Aula 01 Apresentação, estruturas de dados, tabelas de símbolos e hash tables

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

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

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

INF 1620 P3-06/12/03 Questão 1 Nome:

INF 1620 P3-02/07/02 Questão 1 Nome:

Árvores & Árvores Binárias

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

4. Algoritmos de Busca em Vetores

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

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

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

Transcrição:

Tabelas de dispersão 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. A tabela está sujeita a dois tipos de operação: inserção; busca. A dificuldade está em organizar a tabela de maneira que ambas as operações sejam eficientes. Em geral, uma organização que permite inserções rápidas impede buscas rápidas e vice-versa. Um registro de alunos poderia ser representado assim: typedef struct { int chave; char *nome; Aluno; A chave é o número de matrícula do aluno. As funções de inserção e busca nesse caso poderiam ter os seguintes protótipos: void insert(aluno obj) ; Aluno search(int v) ; Tipicamente, a implementação de uma estrutura de dados para conter essas informações é feita por uma tabela de símbolos ou dicionário. Tabela de símbolos ou dicionário É um conjunto de objetos dotados de uma chave (= key). As chaves podem ser qualquer tipo de dados básico que permita comparação: dadas duas chaves ch1 e ch2, deve ser possível dizer se ch1 < ch2 ou ch1 == ch2 ou ch1 > ch2. A tabela de símbolos está sujeita a dois tipos de operação: inserção (= insert = enter), que consiste em introduzir um objeto na tabela; busca (= search = lookup), que consiste em encontrar um objeto que tenha uma dada chave. Às vezes é conveniente admitir também uma operação de remoção (= delete), que consiste em retirar da tabela um ou todos os objetos que tenham uma dada chave. A dificuldade está em organizar a tabela de símbolos de maneira que ambas as operações sejam razoavelmente eficientes. Em geral, uma organização que permite inserções rápidas impede buscas rápidas e vice-versa. Implementações Vetor Lista ligada Endereçamento direto Vetor Aluno objetonulo; objetonulo.chave = 0; Aluno tabela[1000]; int N = 0; void insert(aluno obj) { tabela[n++] = obj;

Aluno search(int v) { int i; for (i = 0; i < N; i++) if (tabela[i].chave == v) break; if (i < N) return tabela[i]; Lista ligada typedef struct No *link; struct No { Aluno obj; link next; ; Aluno search(int v) { link t; for (t = lista; t!= NULL; t->next) if (t->obj.chave == v) break; if (t!= NULL) return t->obj; Essa solução não é muito boa porque as buscas são muito demoradas: elas consomem tempo proprocional a N no pior caso. Se usássemos a estrutura ordenada, o tempo de busca seria reduzido para lg(n) mas o tempo de inserção subiria para N no pior caso. Endereçamento direto A característica mais marcante dessa implementação é o uso de chaves como índices. Com endereçamento direto, as operações de inserção e busca ficam muito rápidas: elas não mais dependem do número de objetos na tabela. Os maiores defeitos dessa implementação são: Não é possível ter dois objetos diferentes com a mesma chave: isso causaria uma "colisão" na tabela (somente a inserção mais recente seria registrada); Despedício de espaço: provavelmente a maior parte da tabela ficaria vazia. Aluno tabela[n]; void insert(tipoobjeto obj) { int v = obj.chave; tabela[h] = obj; Se a tabela de símbolos tem muitos objetos é preciso recorrer a implementações mais sofisticadas como árvores de busca e tabelas de dispersão. Tabela de dispersão Tabela de dispersão ou tabela hash, é um vetor de tamanho fixo em que os elementos são colocados em uma posição determinada por um algoritmo denominado função de dispersão ou função hash. Comportamento O comportamento das tabelas de dispersão é caracterizado por: função de dispersão técnica de resolução de colisões

A característica mais marcante dessa implementação é o uso de chaves como índices. int h = funcaohash(v); int funcaohash(v) { return v - min; História Os estudos sobre tabelas de disporsão surgiram independentemente em vários momentos e locais. H. P. Luhn, em 1953, teve a idéia enquanto trabalhava na IBM G. N. Amdahl, E. M. Boehme, N. Rochester, e Arthur Samuel implementaram um programa usando tabelas de dispersão na mesma época Função hash Uma função hash é uma função matemática que transforma os dados de uma chave em um inteiro relativamente pequeno, chamado de valor de hash ou hasher. O valor de hash é normalmente usado como um índice para um vetor. A função de dispersão envolve o comprimento da tabela para assegurar que os resultados estão dentro da gama pretendida. int hash (const string & key, int tablesize) { int hashval = 0; for ( int i = 0; i < key ; i++ ) hashval = 37*hashVal + key[i]; hashval %= tablesize; if (hashval < 0 ) hashval += tablesize; return hashval; int hash (int key, int tablesize) { if ( key < 0 ) key = -key; return key%tablesize; Características da função hash A função hash deve: ser fácil de calcular ser determinista: duas entradas idênticas geram o mesmo valor de hash distribuir os objetos uniformemente pela tabela Toda tabela de símbolos tem um universo de chaves, que é o conjunto de todas as possíveis chaves. Qualquer função que leva qualquer chave no intervalo [0..M-1] de índices serve como função de dispersão. Vantagens A principal vantagem de tabelas hash sobre outras estruturas de dados é a velocidade. O tempo médio de busca é constante. Esta vantagem é mais evidente quando o número de entradas é grande, especialmente quando o número máximo de entradas pode ser previsto com antecedência e nunca redimensionada. Aplicação Tabelas hash são tipicamente utilizadas para implementar vetores ou matrizes associativos, conjuntos e caches. Comumente utilizadas para indexação de grandes volumes de dados.

Colisões A função perfeita seria a que, para quaisquer entradas A e B, fornecesse saídas diferentes. Quando as entradas A e B, passando pela função de hash, geram a mesma saída, acontece uma colisão. Exemplo de colisão A função de dispersão F(x) = lenght(x) % 10 é uma má função de dispersão, porque tem grandes probabilidades de levar a muitas colisões. Solução para colisões Separate chaining Linear probing Indexação perfeita Separate chaining Uma solução popular para resolver colisões é conhecida como separate chaining: para cada índice h da tabela há uma lista encadeada que armazena todos os objetos que a função de dispersão leva em h. Essa solução é muito boa se cada uma das "listas de colisão" resultar curta. Por causa das colisões, muitas tabelas hash são aliadas a outras estruturas de dados, como uma lista ligada ou árvores B+. Linear probing Um outro método de resolução de colisões é conhecido como linear probing. Todos os objetos são armazenados em um vetor tab[0..m-1]. Quando ocorre uma colisão, procuramos a próxima posição vaga do vetor. void STinsert(tipoObjeto obj) { int v = obj.chave; h = (h + 1) % M; tab[h] = obj; tipoobjeto STsearch(int v) { if (tab[h].chave == v) return tab[h]; else h = (h + 1) % M; tipoobjeto STsearch(int v) { if (tab[h].chave == v) return tab[h]; else h = (h + 1) % M; Os maiores defeitos dessa implementação são: não poder ter dois objetos diferentes com a mesma chave: isso causaria uma "colisão" na tabela; despedício de espaço: provavelmente a maior parte dos números que não correspondem a alunos ou ex-alunos reais ficaria vazia na tabela.

Indexação perfeita Com um conjunto fixo de registros, uma função de espalhamento perfeita pode ser criada para que indexe os itens sem que ocorra uma colisão. Desafios Tabelas hash não são eficientes para conjuntos de dados pequenos; A criação de uma função hash eficiente é custosa; Requer recriação da tabela hash se os dados aumentarem; Não permite recuperar elementos sequencialmente;