Algoritmos e Estruturas de Dados 2005/2006

Documentos relacionados
Tabelas de dispersão

Tabelas de Dispersão. Estrutura de Dados e Algoritmos

Tabelas de Dispersão. Tabela de Dispersão

Árvores binárias de pesquisa

pior caso nas operações de manipulação é O(N) pior caso surge sistematicamente emusos correntes (ex: elementos previamente ordenados)

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.

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

Tipos de Dados Abstractos Estruturas Lineares Listas

Algoritmos e Estruturas de Dados 2005/2006

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

Algoritmos e Estruturas de Dados 2006/2007

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?

Listas Lineares Ordenadas

Algoritmos de pesquisa. Tabelas de dispersão/hash

Algoritmos e Estruturas de Dados 2007/2008

ESTRUTURAS DE DADOS E ALGORITMOS TABELA HASH

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

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

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

Endereçamento Aberto

Árvores Binárias de Busca

Aula 8- Standard Template Library. Arthur Ribacki Gabriel Portal Leonardo Chatain Luiz Fernando Scheidegger Rosália Schneider

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

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

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

Um exercício (pilhas, BST,...)

Algoritmos de Pesquisa e Ordenação em Vectores

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

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

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

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

Tabelas de dispersão/hash

Algoritmos e Estruturas de Dados

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

Algoritmos e Estruturas de Dados 2007/2008. Ajusta a estrutura da árvore à frequência de acesso aos dados

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

Agenda. Ideia. Buscar um item em um array. Função hash. Função hash. Hash Table. Introdução Definição Hash Table. Métodos de resolução de conflitos

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

i a[i]

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

Tabelas de Espalhamento (hash)

Computação e Programação Aula prática nº 5. Enunciados dos problemas

PCS3111. Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 11: Exercício Integrador (parte 2)

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

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

Recursividade UFOP 1/48

Transformação de Chave. (Hashing)

ALGORITMOS E ESTRUTURAS DE DADOS 2011/2012 DICIONÁRIO. Armanda Rodrigues 6 de Outubro 2011

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

Algoritmos e Estruturas de Dados 2005/2006. Algoritmo: conjunto claramente especificado de instruções a seguir para resolver um problema

Tabelas Hash Endereçamento Direto

Tipo de Dados Abstractos: Pilha (stack)

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

Vectores em C++ Classe vector: Introdução

Transformação de Chave - Hashing

Linguagens de Programação Conceitos e Técnicas. Amarrações

Algoritmos e Estruturas de Dados 2005/2006. Conjunto de nós e conjunto de arestas que ligam pares de nós


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

Dicionários. TAD Orientado a conteúdo

CIV 2802 Sistemas Gráficos para Engenharia º Trabalho: Programação básica em C++: Classes

Dicionários. Prof. César Melo

Árvores & Árvores Binárias

Matrizes esparsas: definição

Algoritmos e Estruturas de Dados 2005/2006

Programação Aplicada à Engenharia

Pesquisa Sequencial e Binária

Estruturas de Dados Encadeadas

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

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

ESTRUTURA DE DADOS (TCC )

SCC122 - Estruturas de Dados. Lista Estática Seqüencial

3. Vectores: Algoritmos de Pesquisa. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006)

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2. Trabalho Prático P2B

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA (ABORDAGEM RECURSIVA)

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

Aula 11 Pilha Dinâmica. prof Leticia Winkler

Coleções em Java. Prof. Gustavo Willam Pereira ENG10082 Programação II. Créditos: Prof. Clayton Vieira Fraga Filho

Árvores. Estruturas de Dados. Prof. Vilson Heck Junior

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

Algoritmos e Estruturas de Dados

API e Coleções Java. Sérgio Luiz Ruivace Cerqueira

Hashing: conceitos. Hashing

Algoritmos e Estruturas de Dados

Algoritmos e Estruturas de Dados

Estruturas de Dados. Filas em que a prioridade de remoção não é cronológica. Maior prioridade não é do elemento que ingressou primeiro

Complexidade de Algoritmos

UNIVERSIDADE LUSÓFONA DE HUMANIDADES E TECNOLOGIAS CURSO DE ENGENHARIA ELECTROTÉCNICA/INDUSTRIAL

Programação Orientada a Objetos para Redes de Computadores

DAINF - Departamento de Informática

INSTITUTO SUPERIOR TÉCNICO Algoritmos e Estruturas de Dados

Redefinição de Operadores

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

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

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

Overloading de Operadores

Matemática Discreta 12

Transcrição:

Tabelas de dispersão Algoritmos e Estruturas de Dados 2005/200 Tabela de dispersão Uma tabela de dispersão é um vector de tamanho fixo em que os elementos são colocados em na posição determinada por uma função denominada função de dispersão. A função de dispersão deve: ser fácil de calcular distribuir os objectos uniformemente pela tabela Vários objectos podem ser mapeados em uma mesma posição : colisão O comportamento das tabelas de dispersão é caracterizado por: função de dispersão técnica de resolução de colisões As tabelas de dispersão asseguram tempo médio constante para inserção, remoção e pesquisa 2

Tabelas de dispersão Ilustração do conceito Função de dispersão: F(x) = comprimento(x)%0; Nome Carlos Rodrigo Artur Ana Miguel Clementina Aristófanes F(Nome) É uma má função de dispersão, porque tem grandes probabilidades de levar a muitas colisões 7 5 0 0 2 5 7 8 9 Clementina Aristófanes Ana Artur Carlos / Miguel Rodrigo Tabelas de dispersão Função de dispersão 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 = 7*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; A qualidade da função de dispersão depende do tamanho da tabela: tamanhos primos são os melhores. 2

Tabelas de dispersão Resolução de colisões por listas Os elementos mapeados na mesma posição são guardados numa lista ligada 0 2 0 8... hash(x) = x % 0 5 Tabelas de dispersão Resolução de colisões por listas O desempenho pode ser medido pelo número de sondagens efectuadas. Este depende do factor de carga = número de elementos presentes na tabela / tamanho da tabela Comprimento médio de cada lista é Tempo médio de pesquisa (número de sondagens) Pesquisa sem sucesso: Pesquisa com sucesso : + /2

Tabelas de dispersão Resolução de colisões com dispersão aberta Quando ocorre uma colisão procura-se uma célula alternativa, sondando sequencialmente as posições H (x), H 2 (x),, até se encontrar uma posição livre. H i (x) = ( hash(x) + f(i) ) mod TableSize Sondagem linear : f(i) = i Garante a utilização completa da tabela Sondagem quadrática : f(i) = i 2 Pode ser impossível inserir um elemento numa tabela com espaço Evita o fenómeno da agregação primária 7 Tabelas de dispersão Sondagem linear 58 9 2 0 58 58 58 2 9 9 2 5 7 8 9 hash(x) = x % 0 ; H(x) = ( hash(x) + i ) % 0 8

Tabelas de dispersão Sondagem linear Utiliza toda a tabela : 0 Susceptivel ao fenómeno de agregação primária Número médio de sondagens inserção / pesquisa sem sucesso: ½ ( + / (-) 2 ) pesquisa com sucesso : ½ ( + / (-) ) Número médio de sondagens no caso ideal (sem agregação) inserção / pesquisa sem sucesso: (-) pesquisa com sucesso : / ln(/(-)) Sondagem quadrática elimina o fenómeno de agregação primária 9 Tabelas de dispersão Sondagem quadrática 58 79 2 0 2 58 58 79 2 58 79 5 7 8 9 hash(x) = x % 0 ; H(x) = ( hash(x) + i ) % 0 0 5

Tabelas de dispersão Sondagem quadrática Não garante que se encontre sempre uma posição livre para um dado elemento Quando o tamanho da tabela é primo, e se usa sondagem quadrática, é sempre possível inserir um elemento se a tabela não estiver preenchida a mais de 50% Desempenho aproxima-se do caso ideal sem agregação A geração de posições alternativas na sondagem quadrática pode ser realizada com apenas uma multiplicação : H i = ( H i- + 2i ) mod TableSize Tabelas de dispersão: implementação encadeada Declaração da classe HashTable class HashTable public: explicit HashTable (const T & notfound, int size = 0); HashTable(const HashTable & ht) ; const T & find (const T & x) const; void makeempty(); void insert(const T & x); void remove(const T & x); const HashTable & operator= (const HashTable & ht); private: vector<llist<t> > thelists; const T ITEM_NOT_FOUND; ; 2

Tabelas de dispersão: implementação encadeada classe HashTable : construtores, esvaziar HashTable<T>:: HashTable(const T & notfound, int size) : ITEM_NOT_FOUND(notFound), thelists(nextprime(size)) HashTable<T>:: HashTable(const HashTable & ht) : ITEM_NOT_FOUND(ht.ITEM_NOT_FOUND), thelists(ht.thelists) void HashTable<T>:: makeempty() for ( int i = 0; i < thelists.size(); i++ ) thelists[i].makeempty(); Tabelas de dispersão: implementação encadeada classe HashTable : inserção, remoção, pesquisa void HashTable<T>:: insert(const T & x) LList<T> & lista = thelists[ hash(x, thelists.size()) ]; LListItr<T> itr = lista.find(x); if (itr.ispastend()) lista.insert(x, lista.beforestart()); void HashTable<T>:: remove(const T & x) thelists[ hash(x, thelists.size()) ].remove(x); const T & HashTable<T>:: find(const T & x) const LListItr<T> itr; itr = thelists[ hash(x, thelists.size()) ].find(x); if (itr.ispastend()) return ITEM_NOT_FOUND; else return itr.retrieve(); 7

Tabelas de dispersão: endereçamento aberto Declaração da classe HashTable (secção pública) class HashTable public: explicit HashTable (const T & notfound, int size = 0); HashTable(const HashTable & ht) ; const T & find (const T & x) const; void makeempty(); void insert(const T & x); void remove(const T & x); const HashTable & operator= (const HashTable & ht); enum EntryType ACTIVE, EMPTY, DELETED ; private: //... ; 5 Tabelas de dispersão: endereçamento aberto Declaração da classe HashTable (secção privada) class HashTable //... private: struct HashEntry T element; EntryType info; HashEntry(const T & e = T(), EntryType i = EMPTY) : element(e), info(i) ; ; vector<hashentry> array; int currentsize; const T ITEM_NOT_FOUND; bool is Active(int currentpos) const; int findpos(const T & x) const; void rehash(); 8

Tabelas de dispersão: endereçamento aberto classe HashTable : construtores, esvaziar HashTable<T>:: HashTable(const T & notfound, int size) : ITEM_NOT_FOUND(notFound), array(nextprime(size)) HashTable<T>:: HashTable(const HashTable & ht) : ITEM_NOT_FOUND(ht.ITEM_NOT_FOUND), array(ht.array), currentsize(ht.currentsize) void HashTable<T>:: makeempty() currentsize = 0; for ( int i = 0; i < array.size(); i++ ) array[i].info = EMPTY; 7 Tabelas de dispersão: endereçamento aberto classe HashTable : pesquisa const T & HashTable<T>:: find(const T & x) const int currentpos = findpos(x); if ( isactive(currentpos) ) return array[currentpos].element; else return ITEM_NOT_FOUND; int HashTable<T>:: findpos(const T & x) const int collisionnum = 0; int currentpos = hash(x, array.size()); while( array[currentpos].info!= EMPTY && array[currentpos].element!= x ) currentpos += 2 * ++collisionnum ; if ( currentpos >= array.size() ) currentpos -= array.size(); return currentpos; 9

Tabelas de dispersão: endereçamento aberto classe HashTable : inserção void HashTable<T>:: insert(const T & x) int currentpos = findpos(x); if ( isactive(currentpos) ) return; array[currentpos] = HashEntry(x, ACTIVE); if ( ++currentsize > array.size()/2 ) rehash(); void HashTable<T>:: rehash() vector<hashentry> oldarray = array; array.resize(nextprime(2 * oldarray.size())); for( int j = 0; j < array.size(); j++ ) array[j].info = EMPTY; currentsize = 0; for( int i = 0; i < oldarray.size(); i++ ) if ( oldarray[i].info == ACTIVE ) insert(oldarray[i].element); 9 Tabelas de dispersão: endereçamento aberto classe HashTable : remoção void HashTable<T>:: remove(const T & x) int currentpos = findpos(x); if ( isactive(currentpos) ) array[currentpos].info = DELETED; bool HashTable<T>:: isactive(int currentpos) const return ( array[currentpos].info == ACTIVE ); 20 0

Tabelas de Dispersão (Standard Template Library - STL) class hash_set hash_set<t, HashFunc, EqualFunc> Alguns métodos: void insert(const T & x) iterator erase(iterator it) iterator find(const T & x) const iterator begin() iterator end() bool empty() const void clear() (http://www.sgi.com/tech/stl/hash_set.html) 2 Tabelas de dispersão: aplicação Contagem de palavras diferentes Pretende-se escrever um programa que leia um ficheiro de texto e indique o número de palavras diferentes nele existentes. Usar uma tabela de dispersão, onde são guardadas as palavras diferentes que vão sendo encontradas. Para cada palavra, verificar se já existe na tabela; se não existir, inseri-la e incrementar um contador (conta o número de palavras diferentes). 22

Tabelas de dispersão: aplicação int diff = 0; string NOT_FOUND( ); HashTable<string> tab(not_found); palavra = getpalavra(); while (palavra!= ) string s = tab.find(palavra); if ( s == NOT_FOUND) diff ++; tab.insert(palavra); palavra = getpalavra(); cout << número de palavras diferentes : << diff << endl; 2 Tabelas de dispersão: aplicação // uso de tabela de dispersão implementada através da classe hash_set (STL) struct eqstr bool operator() (string s, const string s2) const return s==s2; ; struct hstr int operator() (string s) const int v = 0; for ( int i=0; i< s.size(); i++ ) v = 7*v + s[i]; return v; ; typedef hash_set<string, hstr, eqstr> hashstr; int diff = 0; hashstr tab; palavra = getpalavra(); while (palavra!= ) hashstr::iterator it = tab.find(palavra); if ( it == tab.end() diff ++; tab.insert(palavra); palavra = getpalavra(); cout << número de palavras diferentes : << diff << endl; 2 2