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



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

Algoritmos de pesquisa. Tabelas de dispersão/hash

Tabela de símbolos: tabelas de espalhamento

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

Tabelas Hash. Também conhecido como tabelas de dispersão. Até agora... MoFvação. Exercício

Hashing. Rafael Nunes LABSCI-UFMG

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

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

Busca. Pesquisa sequencial

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

5 Caso de estudo O cartão fidelidade

Programação de Computadores - I. Profª Beatriz Profº Israel

Tabelas Hash. Jeane Melo

insfcanceof new public switch transient while byte continue extends for int null

Árvores Binárias de Busca

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

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Árvores Binárias de Busca

Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior

HASHING. Katia Guimarães. 1

DICIONÁRIOS. template<class K,class T> class Par { public: K chave; T valor; Par():chave(),valor()

Interfaces. Interfaces: Exemplo. ! São um mecanismo poderoso para ter bons desenhos pois permitem separar contratos das implementações

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Tabelas de Dispersão. Tabela de Dispersão

Pesquisa Sequencial e Binária

Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Tabelas de Espalhamento

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Pilhas Filas e Listas

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

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

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

Tabelas de Dispersão. Estrutura de Dados e Algoritmos

JSP - ORIENTADO A OBJETOS

BSI UFRPE Prof. Gustavo Callou

ESTRUTURA DE DADOS PILHA

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

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

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Fila de Prioridade. Siang Wun Song - Universidade de São Paulo - IME/USP. MAC Estruturas de Dados

EAD Árvore - representação usando listas ligadas

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º

Árvore Binária de Busca

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Hashing. Estruturas de Dados. Motivação

Consistem num conjunto de apontadores para instâncias especificas de cada relação.

Programação Orientada a Objetos. Encapsulamento

Técnicas de Programação II

Java. Marcio de Carvalho Victorino

Métodos de Pesquisa em Memória Primária

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

Persistência de Dados

O programa abaixo exemplifica o uso da classe Image para carregar e mostrar uma imagem localizada em um arquivo.

O dono de uma livraria cuja base de dados é administrada por si pediu-lhe para efectuar as seguintes alterações ao preço dos livros:

EAD Árvore árvore binária

Aula 09 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Unidade IV: Ponteiros, Referências e Arrays

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Guia de Fatores de Qualidade de OO e Java

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

PROGRAMAÇÃO II 4. ÁRVORE

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados I

3 Classes e instanciação de objectos (em Java)

Hashing Letícia Rodrigues Bueno

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

Estruturas de Dados Aula 15: Árvores 17/05/2011

Complexidade de Algoritmos

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Manipulando Strings no VBA (Replace, Mid e InStr)

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

PROGRAMAÇÃO II 3. PILHA DINÂMICA

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

Capítulo 4. Packages e interfaces

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

Estrutura de Dados. Unidade VI. -Tabela Hash -Grafos. Prof. Ms. Amilton Souza Martha

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Modulo IIa Extra: Object

Lista Ligada. Nó de Lista Ligada

Estrutura de Dados Árvores. Prof. Robinson Alves

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira

Android e Bancos de Dados

Tarefa Orientada 18 Procedimentos armazenados

Resolvendo objeto-relacional impedance mismatch com hibernate

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Programação por Objectos. Java

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Capítulo 8. Introdução UML

Transcrição:

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

2 Guardar todos os documentos da biblioteca Vamos voltar ao nosso exemplo da biblioteca Os utilizadores do sistema da biblioteca devem poder executar as seguintes tarefas: Inserir um novo documento na biblioteca esta operação recebe toda a informação relativa a um documento e só deve ter sucesso se a cota do documento não existe já na biblioteca Remoção de um documento da biblioteca esta operação só deve ter sucesso se a cota do documento existe na biblioteca e deve devolver o documento removido Aceder à informação associada a um documento da biblioteca - esta operação só deve ter sucesso se a cota do documento existe na biblioteca

TAD Biblioteca 3

4 Interface Library incompleto (1) package library; public interface Library { // Add new Book to library // Requires: documentcode does not identify an existing document void addnewbook(string title, String subject, String documentcode, String publisher, String author, long ISBN) throws ExistingDocException; // Add new Journal to library // Requires: documentcode does not identify an existing document void addnewjournal(string title, String subject, String documentcode, String publisher, int ISSN, String URL) throws ExistingDocException; }

5 Interface Library incompleto (2) package library; public interface Library { // Removes document identified by documentcode from library and returns // removed document. If the document does not exist, returns null. // Requires: documentcode identifies document in library Document removedocument(string documentcode) throws NonExistingDocException; // Returns document identified by documentcode from library // Requires: documentcode identifies document in library Document getdocument(string documentcode) throws NonExistingDocException; }

6 Library perguntas O que representa a String documentcode neste sistema? Que características deve ter? O que representa o tipo Document neste Sistema? Quais as características que gostaríamos de ver associadas às operações apresentadas no TAD? Qual deveria ser a complexidade temporal das implementações do TAD? Será possível cumprir esse requisito?

7 Respostas A String documentcode é uma chave de acesso a um documento O TAD Dicionário reflete os serviços de acesso a objetos genéricos com uma chave associada Uma implementação de dicionário permitirá guardar a informação relativa a todos os documentos da biblioteca Seria aconselhável um acesso rápido a um objeto, a partir da sua chave

TAD Dicionário Acesso por chave 8

9 TAD Dicionário Chaves do Tipo K e Valores do Tipo V // Se existir uma entrada no dicionário cuja chave é a especificada, // retorna o seu valor; no caso contrário, retorna NIL. V {NIL} pesquisa( K chave ); // Se existir uma entrada no dicionário cuja chave é a especificada, // substitui o seu valor pelo valor especificado e retorna o valor antigo; // no caso contrário, insere a entrada (chave, valor) e retorna NIL. V {NIL} insere( K chave, V valor ); // Se existir uma entrada no dicionário cuja chave é a especificada, // remove a do dicionário e retorna o seu valor; // no caso contrário, retorna NIL. V {NIL} remove( K chave );

10 Interface Dicionário (K,V) (1) package datastructures; public interface Dictionary<K,V>{ // Returns true iff the dictionary contains no entries. boolean isempty( ); // Returns the number of entries in the dictionary. int size( ); // Returns an iterator of the entries in the dictionary. Iterator<Entry<K,V>> iterator( ); O dicionário guarda valores deste tipo: K refere o tipo que permite fazer o acesso (a chave), V o tipo do valor identificado pela chave Quando criamos um dicionário temos de saber qual o tipo da chave e qual o tipo do valor

11 Interface Dicionário (K,V) (2) // If there is an entry in the dictionary whose key is the specified key, // returns its value; otherwise, returns null. V find( K key ); // If there is an entry in the dictionary whose key is the specified key, // replaces its value by the specified value and returns the old value; // otherwise, inserts the entry (key, value) and returns null. V insert( K key, V value ); // If there is an entry in the dictionary whose key is the specified key, // removes it from the dictionary and returns its value; // otherwise, returns null. V remove( K key ); }// End of Dictionary

12 Classe de Exceções do Dicionário package datastructures; public class FullDictionaryException extends RuntimeException{ public FullDictionaryException( ){ super(); } } public FullDictionaryException( String msg ){ super(msg); }

13 TAD Entrada Acesso aos campos Chave e Valor

14 Interface Entrada (K,V) package datastructures; public interface Entry<K,V>{ // Returns the key in the entry. K getkey( ); } // Returns the value in the entry. V getvalue( );

15 TAD Objecto Comparável Comparação com outro Objecto

16 Interface Objeto Comparável Objetos do Tipo T package java.lang; public interface Comparable<T>{ } // Compares this object with the specified object for order. // Returns a negative integer, zero, or a positive integer // as this object is less than, equal to, or greater than // the specified object. int compareto( T object );

17 Tabela de Dispersão A estrutura de dados Tabela de Dispersão é suportada pelo conceito de função de dispersão Dada uma chave que identifica univocamente um objeto, a função de dispersão converte a mesma chave num número inteiro dentro de um intervalo determinado A utilização da função de dispersão permite aceder ao objeto que a chave identifica de uma forma expedita A utilização da função de dispersão para localizar um objeto comporta a possibilidade de se darem colisões Dois objetos diferentes podem ter a mesma dispersão, o que implica que estes dois objetos poderão ser armazenados na mesma zona As colisões têm de ser tratadas e resolvidas

18 Tabela de dispersão aberta 0 1 2 3 4 5 6 7 8 9 10 11 A função de dispersão mapeia a chave de cada objeto a guardar na TD, para um índice do vetor Quando se insere mais do que um objeto com a mesma dispersão, cria-se uma lista de colisões, no índice associado à dispersão

19 Tabela de dispersão aberta 0 1 2 3 4 5 6 7 8 9 10 11 dim (12) é a dimensão do vetor K é o conjunto (domínio) das chaves que identificam os objetos a guardar n (7) número de objetos guardados na tabela = n / dim deve ser sempre inferior a 1 Complexidade ideal O(1) Se for inferior a 1 e a função de dispersão for apropriada, o preenchimento da tabela será esparso e a dimensão das listas curta. O acesso a um elemento estará perto de O(1)

20 Função de Dispersão 0 1 2 i k,v dispersão : K { 0,1, 2,, dim-1} dispersão (k) = i dim-1 Colisões: Se #K > dim, existem k1, k2 K tais que: k1 k2 e dispersão(k1) = dispersão(k2)

21 Função de Dispersão Objetivos Deve ser eficiente. Deve distribuir as chaves uniformemente por todas as posições da tabela. Regras Práticas A função de dispersão deve ser simples de calcular A dimensão da tabela (dim) deve ser um número primo. Se as chaves forem grandes, deve-se considerar apenas uma parte, oriunda de vários pontos.

22 Cálculo da função de dispersão (2 passos) Passo 1: Cada chave sabe calcular o seu código de dispersão. public int hashcode( ); Passo 2: A tabela de dispersão converte o código de dispersão da chave num índice da tabela. Math.abs( key.hashcode() ) % table.length

23 Exemplos de códigos de dispersão Se a chave é um número inteiro n o código será o próprio n. Se a chave é uma cadeia de caracteres s 0 s 1 s n-1 : s 0 +s 1 + +s n-1 ; (s 0 a n-1 +s 1 a n-2 + +s n-1 ) % b (onde a e b são primos)

24 Regra de Horner (1) códigodisp(s 0 s 1 s n-1 ) = (s 0 a n-1 +s 1 a n-2 + +s n-1 ) % b v 0; v (v * a + s 0 ) % b = (s 0 )% b v (v * a + s 1 ) % b = (s 0 a + s 1 )% b v (v * a + s 2 ) % b = (s 0 a 2 + s 1 a + s 2 )% b v (v * a + s 3 ) % b = (s 0 a 3 + s 1 a 2 + s 2 a + s 3 )% b

25 Regra de Horner (2) códigodisp(s 0 s 1 s n-1 ) = (s 0 a n-1 +s 1 a n-2 + +s n-1 ) % b public static int hash( String key ){ int a = 127; // a is a prime number. int b = 2147483647; // b is a prime number. int hashcode = 0; } for ( int i = 0; i < key.length(); i++ ) hashcode = ( hashcode * a + key.charat(i) ) % b; return hashcode;

26 Tabela de Dispersão Aberta (Separate Chaining) 0 1 2 3 4 5 6 7 8 9 10 11 3 17 7 19 31 Dispersão(k) = k % 12 Criar a TD: Criar o vetor de listas ligadas (do tipo dicionário) e criar todas as listas de colisões (que podem ser simples ou duplas, ordenadas ou desordenadas). Pesquisar k: Calcular dispersão(k) e pesquisar k no dicionário associado à dispersão(k) Inserir k,v: Calcular dispersão(k), inserir k,v no dicionário associado à dispersão(k) Remover k: Calcular dispersão(k), remover k do dicionário associado à dispersão(k)

27 Fator de Ocupação da tabela de dispersão Sejam: n - o número de entradas na tabela dim a dimensão da tabela Fator de Ocupação da tabela : deve ser sempre inferior a 1 ( é o comprimento médio das listas de colisões)

28 Complexidades da Dispersão Aberta Pesquisa Melhor Caso Pior Caso Caso Esperado Com sucesso O(1) O(n) O(1+ ) Sem sucesso O(1) O(n) O(1+ )

29 Classe Abstrata Tabela de Dispersão (1) package datastructures; public abstract class HashTable<K,V> implements Dictionary<K,V>{ // Default size of the hash table. public static final int DEFAULT_CAPACITY = 50; // Number of entries in the hash table. protected int currentsize; // Maximum number of entries. protected int maxsize;

30 Classe Abstrata Tabela de Dispersão (2) // Public Static Methods // Returns the hash code of the specified key, // which is an integer in the range 0,..., b 1. public static int hash( String key ){ int a = 127; // a is a prime number. int b = 2147483647; // b is a prime number. int hashcode = 0; } for ( int i = 0; i < key.length(); i++ ) hashcode = ( hashcode * a + key.charat(i) ) % b; return hashcode;

31 Classe Abstrata Tabela de Dispersão (3) // Protected Static Methods // Returns a prime number that is not less than the // specified number; or zero if all such primes are greater // than Integer.MAX VALUE. protected static int nextprime( int number ){ for ( int i = 0; i < PRIMES.length; i++ ) if ( PRIMES[i] >= number ) return PRIMES[i]; return 0; } protected static final int[] PRIMES = { 11, 19, 31, 47, 73,, 1431655751, 2147483647 };

32 Classe Abstrata Tabela de Dispersão (4) // Public Instance Methods // Returns true iff the dictionary contains no entries. public boolean isempty( ){ return currentsize == 0; } // Returns the number of entries in the dictionary. public int size( ){ return currentsize; }

33 Classe Abstrata Tabela de Dispersão (5) // If there is an entry in the dictionary whose key is the specified // key, returns its value; otherwise, returns null. public abstract V find( K key ); // If there is an entry in the dictionary whose key is the specified // key, replaces its value by the specified value and returns the old // value; otherwise, inserts the entry (key, value) and returns null. public abstract V insert( K key, V value ); // If there is an entry in the dictionary whose key is the specified // key, removes it from the dictionary and returns its value; // otherwise, returns null. public abstract V remove( K key ); // Returns an iterator of the entries in the dictionary. public abstract Iterator<Entry<K,V>> iterator( );

34 Classe Abstrata Tabela de Dispersão (6) // Protected Instance Methods // Returns true iff the hash table cannot contain more entries. protected boolean isfull( ){ return currentsize == maxsize; } } // End of HashTable.

35 Classe Tabela de Dispersão Aberta (1) package datastructures; public class SepChainHashTable<K extends Comparable<K>, V> extends HashTable<K,V>{ // The array of dictionaries. protected Dictionary<K,V>[] table; public SepChainHashTable( ){ this(default CAPACITY); }

36 Classe Tabela de Dispersão Aberta (2) public SepChainHashTable( int capacity ){ int arraysize = HashTable.nextPrime((int) (1.1 * capacity)); // Compiler gives a warning. table = (Dictionary<K,V>[]) new Dictionary[arraySize]; } for ( int i = 0; i < arraysize; i++ ) table[i] = new OrderedDoublyLL<K,V>(); maxsize = capacity; currentsize = 0;

37 Classe Tabela de Dispersão Aberta (3) // Returns the hash value of the specified key. protected int hash( K key ){ return Math.abs( key.hashcode() ) % table.length; } // If there is an entry in the dictionary whose key is the // specified key, returns its value; otherwise, returns null. public V find( K key ){ return table[ this.hash(key) ].find(key); }

38 Classe Tabela de Dispersão Aberta (4) // If there is an entry in the dictionary whose key is the // specified key, replaces its value by the specified value and // returns the old value; otherwise, inserts the entry // (key, value) and returns null. public V insert( K key, V value ){ if ( this.isfull() ) this.rehash(); // Efectua se a inserção.... }... } // End of SepChainHashTable.

39 Implementação TAD Biblioteca Dicionário de Documentos em Tabela de Dispersão Aberta

40 LibraryClass - incompleta(1) package library; import datastructures.*; public class LibraryClass implements Library { // Library documents repository private Dictionary<String,Document> documents; // Library document returns private CopyReturn returns;... public LibraryClass(int capacity){ documents=new SepChainHashTable<String,Document>(capacity); returns=new CopyReturnClass();... }

41 LibraryClass - incompleta(2) // Add new Book to library // Requires: documentcode does not identify an existing document public void addnewbook(string title, String subject, String documentcode, String publisher, String author, long ISBN) throws ExistingDocException{ Document d; if (documents.find(documentcode)!= null) throw new ExistingDocException(); else { d = new BookClass(title, subject, documentcode, publisher, author, ISBN); documents.insert(documentcode, d); } }

42 LibraryClass - incompleta(3) // Removes document identified by documentcode from library and returns // removed document. If the document does not exist, returns null. //Requires: documentcode identifies document in library public Document removedocument(string documentcode) throws NonExistingDocException{ Document d = documents.remove(documentcode); if (d == null) throw new NonExistingDocException(); else return d; } // Returns document identified by documentcode from library // Requires: documentcode identifies document in library public Document getdocument(string documentcode) throws NonExistingDocException{ } Document d = documents.find(documentcode); if (d == null) throw new NonExistingDocException(); else return d;

43 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 Dispersão(k) = k % 12 1. Inserir (15,V 15 ) Dispersão(15) = 3

44 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) Dispersão(k) = k % 12 1. Inserir (15,V 15 ) Dispersão(15) = 3

45 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) Dispersão(k) = k % 12 1. Inserir (31,V 31 ) Dispersão(31) = 7

46 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (31,V 31 ) Dispersão(k) = k % 12 1. Inserir (31,V 31 ) Dispersão(31) = 7

47 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (31,V 31 ) Dispersão(k) = k % 12 1. Inserir (11,V 11 ) Dispersão(11) = 11

48 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (31,V 31 ) (11,V 11 ) Dispersão(k) = k % 12 1. Inserir (11,V 11 ) Dispersão(11) = 11

49 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (31,V 31 ) (11,V 11 ) Dispersão(k) = k % 12 1. Inserir (19,V 19 ) Dispersão(19) = 7

50 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (19,V 19 ) (11,V 11 ) (31,V 31 ) Dispersão(k) = k % 12 1. Inserir (19,V 19 ) Dispersão(19) = 7

51 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (19,V 19 ) (11,V 11 ) (31,V 31 ) Dispersão(k) = k % 12 1. Inserir (23,V 23 ) Dispersão(23) = 11

52 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (19,V 19 ) (11,V 11 ) (31,V 31 ) (23,V 23 ) Dispersão(k) = k % 12 1. Inserir (23,V 23 ) Dispersão(23) = 11

53 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (15,V 15 ) (19,V 19 ) (11,V 11 ) (31,V 31 ) (23,V 23 ) Dispersão(k) = k % 12 1. Remover (15) Dispersão(15) = 3

54 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (19,V 19 ) (11,V 11 ) (31,V 31 ) (23,V 23 ) Dispersão(k) = k % 12 1. Remover (15) Dispersão(15) = 3

55 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (19,V 19 ) (11,V 11 ) (31,V 31 ) (23,V 23 ) Dispersão(k) = k % 12 1. Remover (7) Dispersão(7) = 7

56 Tabela de Dispersão Aberta - exemplo 0 1 2 3 4 5 6 7 8 9 10 11 (19,V 19 ) (11,V 11 ) (31,V 31 ) (23,V 23 ) Dispersão(k) = k % 12 1. Remover (43) Dispersão(43) = 7

57 Dispersão Fechada (Open Addressing) 0 1 2 i dim-1 k,v Tabela de Dispersão constituída apenas pelas posições contidas no vetor dispersão : K { 0,1, 2,, dim-1} dispersão (k) = i dispersão (k ) = i Na pesquisa da chave k, quando a posição da tabela indicada pela função de dispersão - dispersão(k ) - já está ocupada com uma entrada cuja chave é diferente de k, recorre-se a uma segunda função - a função de sondagem - que indica outra posição da tabela. Visitam-se as posições p 0 (k ), p 1 (k ), p 2 (k ), tais que: p j (k ) = ( dispersão(k )+sondagem(j) ) % dim Tendo-se sempre sondagem(0) = 0

58 Sondagem Linear (Linear Probing) Neste método a função de sondagem é representada por: sondagem(j) = j sondagem(0) = 0 sondagem(1) = 1 sondagem(2) = 2 sondagem(3) = 3 p 0 = ( dispersão(k)+0 ) % dim p 1 = ( dispersão(k)+1 ) % dim p 2 = ( dispersão(k)+2 ) % dim p 3 = ( dispersão(k)+3 ) % dim Primeira Posição: pos dispersão(k) Posição Seguinte: pos (pos + 1 ) % dim

59 Sondagem Linear - exemplo dim = 7 dispersão(n) = n % 7 1.dispersão(5) = 5 2.dispersão(24) = 3 3.dispersão(39) = 4 4.dispersão(11) = 4 5.dispersão(10) = 3 10 24 39 5 11 0 1 2 3 4 5 6

60 Sondagem Linear (Só pesquisas e inserções) (1) // table is an array of entries. // Returns the position where the entry with the specified key is, // or the first empty position found, if no such entry exists. protected int findpos( K key ){ int pos = this.hash(key); } while ( table[pos]!= null &&!table[pos].getkey().equals(key) ) pos = ( pos + 1 ) % table.length; return pos;

61 Sondagem Linear (Só pesquisas e inserções) (2) // If there is an entry in the dictionary whose key is the // specified key, returns its value; otherwise, returns null. public V find( K key ){ int pos = this.findpos(key); } if ( table[pos] == null ) return null; else return table[pos].getvalue();

62 Problemas da sondagem linear Existência de blocos contíguos de posições ocupadas de grandes dimensões (em geral, quando 0.5). A sondagem é igual para chaves que colidem.

63 Dispersão Dupla (Double Hashing) Neste método a função de sondagem é representada por: sondagem(j) = j * dispersão2(k) O incremento varia com a chave, é definido pela 2ª função de dispersão p 0 = ( dispersão(k)+0 ) % dim p 1 = ( dispersão(k)+dispersão2(k) ) % dim p 2 = ( dispersão(k)+2dispersão2(k)) % dim p 3 = ( dispersão(k)+3dispersão2(k)) % dim Primeira Posição: pos dispersão(k); inc dispersão2(k) Posição Seguinte: pos (pos + inc ) % dim

64 Dispersão Dupla - Segunda função de dispersão Objetivos da 2ª função de dispersão: Não pode retornar zero. Deve retornar números que sejam primos com dim. Se dim for primo, basta garantir que os valores retornados variam entre 1 e dim -1.

65 Dispersão fechada - Espaço Para garantir que o ciclo de pesquisa termina, é necessário assegurar que existem posições vazias. Método de resolução de ideal máximo Colisões Sondagem Linear 0.5 0.8 Dispersão Dupla 0.5 0.8 Deve-se pré-dimensionar a tabela tendo em vista o fator de ocupação ideal, permitindo inserções apenas enquanto não for atingido o fator de ocupação máximo.

66 Dimensionamento da Dispersão Fechada Exemplo Se o número esperado de entradas for 50 Dimensão da Tabela 101 (número primo a seguir a 50/0.5) Aceita-se a inserção de, no máximo, 80 entradas (0.8 * 101 = 80.8). Na inserção de 81ª entrada: Efetua-se a redispersão insere-se as 80 entradas existentes numa tabela maior (que, em geral, tem o dobro da capacidade), e Insere-se a nova entrada na nova tabela.

67 Complexidades da Sondagem Linear Sendo n o número de entradas na tabela Fator de Ocupação Pesquisa (caso esperado) 0.25 0.5 0.75 0.8 0.9 Com sucesso 1.2 1.5 2.5 3.0 5.5 Sem Sucesso 1.4 2.5 8.5 13.0 50.5

69 Remoção - Sondagem Linear dim = 7 dispersão(n) = n % 7 1.Remover(24) 9 24 39 5 11 0 1 2 3 4 5 6

70 Remoção - Sondagem Linear dim = 7 dispersão(n) = n % 7 1.Remover(24) 9? 39 5 11 0 1 2 3 4 5 6

71 Remoção - Sondagem Linear dim = 7 dispersão(n) = n % 7 1.Remover(24) 9 Rem ovida 39 5 11 0 1 2 3 4 5 6

72 Remoção - Sondagem Linear dim = 7 dispersão(n) = n % 7 1.Remover(24) 2. Inserção 72, V dispersão(72) = 2 9 Rem ovida 39 5 11 0 1 2 3 4 5 6

73 Remoção - Sondagem Linear dim = 7 dispersão(n) = n % 7 1.Remover(24) 2. Inserção 72, V dispersão(72) = 2 9 72 39 5 11 0 1 2 3 4 5 6 Tenho sempre de avançar no vetor até encontrar uma posição vazia, ou até encontrar a chave No entanto, a inserção, caso seja possível, deve ser feita na posição em estado removida

74 Sondagem linear com remoção(1) Estados de uma posição: Vazia Nunca foi preenchida Preenchida contém uma entrada Removida já conteve uma entrada, que foi removida e ainda não voltou a ser preenchida Pesquisar k: o ciclo de pesquisa termina quando se encontra k ou uma posição Vazia Remover k: o ciclo de pesquisa da chave para remoção termina quando se encontra k ou uma posição Vazia Se se encontra k: Assinala-se a posição onde está k como sendo Removida

75 Remoção na sondagem linear (2) Inserir k,v: envolve dois ciclos de pesquisa antes de fazer a inserção O primeiro ciclo termina quando se encontra k, uma posição Vazia ou uma posição Removida Vazia: Insere-se k,v nessa posição Removida: Guarda-se essa posição (posição se inserir) e executa-se o segundo ciclo O segundo ciclo termina quando se encontra K ou uma posição Vazia Vazia: Insere-se k,v em posição se inserir Este algoritmo resolve o problema, mas ao fim de algum tempo, a tabela terá várias posições Removida, o que vai afetar a performance Quando a remoção é importante, deve-se usar Dispersão Aberta

76 Comparação de tipos de dispersão Vantagens da Dispersão Aberta Suporta a operação de remoção Os diferentes conjuntos de chaves que colidem (as listas de colisões) não se misturam Vantagens da Dispersão Fechada Gasta menos memória (alguns bytes por entrada)

77 Vantagens da Dispersão Caso esperado: complexidades de pesquisa e inserção (e de remoção na DA) são constantes A técnica é eficiente e só depende do fator de ocupação e da qualidade das funções (dispersão, sondagem (na DF))

78 Problemas da Dispersão Não é uma estrutura dinâmica Não suporta operações que se baseiem na relação de ordem entre as chaves: mínimo, máximo, percurso ordenado Pior Caso: As complexidades das operações de pesquisa e inserção (e de remoção, na DA) são lineares no número de entradas na tabela