Hashing - Espalhamento

Slides:



Advertisements
Apresentações semelhantes
JAVA Orientação a Objetos
Advertisements

HASHING Katia Guimarães julho/2002
Programação em Java Prof. Maurício Braga
Recursividade Inhaúma Neves Ferraz
ESTRUTURA DE DADOS LES.
Programação Orientada a Objeto
Utilitários Marco Antonio. Enum Como o nome sugere, é uma enumeração de opções para uma determinada situação A principal vantagem é limitar as opções.
Collections Marco Antonio, Arquiteto de Software – TJDF Atualizado Dezembro/2008.
Java Básico Arrays Marco Antonio, Arquiteto de Software – TJDF Atualizado: Fevereiro/2009.
Tratamento de Exceções
LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS INTRODUÇÃO AOS APLICATIVOS JAVA Prof. Thiago Pereira Rique
Programação orientada a objetos
Orientação a Objetos: Modificador Final para Métodos e Classes
Pesquisa em Memória Primária
Pesquisa em Memória Primária - Hashing
Pesquisa em Memória Primária
Hashing (Espalhamento)
Walfredo Cirne walfredo.dsc.ufpb.br
Linguagem C LPG-I – Variáveis Estruturadas – Vetores
Wagner Santos C. de Jesus
Capítulo 8 Construtores. 2 Capítulo 8 – Construtores Construtores Método Construtor Múltiplos métodos construtores Array de objetos.
Classes e objetos Arrays e Sobrecarga
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
Marco Antonio Montebello Júnior
Tipos Agregados Homogêneos e Listas
Programação Orientada a Objetos com Java
C# Sharp Shooters.NET Universidade Federal de Pernambuco Centro de Informática Recife, 23/09/2002 Autor: Marden Menezes Costa Propriedades.
Pesquisa em memória primária: hashing
JAVA Orientação a Objetos
TDNE Serviço de Tradução. Classe Entrada – Representa uma entrada do dicionário public class Entrada { private String termo; private String traducao;
Algorítmos e estrutura de dados III
Programação I Aula 2 (Métodos)
Linguagem técnica de programação I Java
Banco de Dados de Objetos
Hash tables Fábio Nakano.
Capítulo 1 Tipo enumerado.
Aula 3 Igor Ebrahim (ies) if669 - Introdução à Programação Monitoria de IP.
Orientação a Objetos e Java Graduação em Ciência da Computação
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa Membro Static.
LPII Professora Lucélia. Pacotes Um pacote em Java é um diretório onde ficam armazenadas uma ou mais classes. Geralmente as classes com a mesma afinidade.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Wagner Santos C. de Jesus
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Tabelas Hash Prof. Túlio Toffolo
Implementação Orientada a Objetos – Aula 03
Programação Orientada a Objetos - Java
Programação I Aula 3 (Entrada de Dados) Prof. Gilberto Irajá Müller Última atualização 11/3/2009.
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Java Kickstart, day 2 Semelhanças com linguagem C.
Implementação Orientada a Objetos – Aula 05 Construtores e sobrecarga de métodos Prof. Danielle Martin Universidade de Mogi das Cruzes
Polimorfismo.
Curso de Linguagem Java
Funções Matemáticas e de String
Classes Abstratas e Interface
M ÉTODOS DA C LASSE S TRING. FUNÇÕES COM STRING Uma string é um tipo texto que corresponde à união de um conjunto de caracteres. Em Java, as strings são.
Tabela Hash Alunos : Gustavo Jorge Zanin nºUSP
Aula Prática 5 05/05/2010. //Estrutura do método public int subtrair (int a, int b){ //Calcule a operação desejada. int resultado = a – b; //Retorne o.
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Coleções em Java - Parte 2
Herança Modelagem e Programação Orientada a Objetos
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Operador Condicional (? :). Operador Condicional Operador ternário que pode ser utilizado no lugar de uma instrução if...else.
Estrutura de dados Aula 6 - hash
Laboratório de Programação II Método main Dados e Métodos de Classes.
Curso Básico de Android
Hashing (Tabela de Dispersão)
Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva.
Transcrição da apresentação:

Hashing - Espalhamento Tabelas Hash

Introdução Tabela Hash: permite realizar buscas eficientes em um conjunto de elementos armazenados em uma tabela (um arranjo) de maneira não ordenada. Mecanismos de inserção e recuperação do elemento Dado um par {chave, elemento}, onde chave é a chave de busca e elemento é o elemento a ser armazenado: Inserção: Utilizando a chave, calcula-se o índice da posição na tabela onde o elemento deve ser ordenado. Inserir o elemento na posição calculada Recuperação Utilizando a chave, calculo o índice onde o elemento está armazenado Pego o elemento na posição do índice calculado

Hashtable: exemplo de Hash em Java public class Elemento { private String nome; private String telefone; /* construtor e metodos get e set */ } public static void main(String[] args) { Hashtable tab1 = new Hashtable(); Elemento e; e = new Elemento(); e.setNome("Laura"); e.setTelefone("54"); tab1.put(e.getNome(),e); e = new Elemento(); e.setNome("Luciana"); e.setTelefone("33"); tab1.put(e.getNome(),e); System.out.println("Informe o nome:"); String nome = InputHandler.readString(); Elemento en = (Elemento) tab1.get(nome); System.out.println(" O telefone de " + nome + " eh " + en.getTelefone());

Construindo uma tabela Hash com Vetores O índice na tabela relativa a uma chave é obtida aplicando-se uma transformação aritmética (h) sobre a chave. Esta transformação deve gerar um valor que varie de 0 a N-1 { Índice registro 1 2 .. N-1 h(k)

Construindo uma tabela Hash com Vetores Um problema é que uma única chave pode gerar o mesmo índice. Este problema é conhecido por colisão Por maior que seja a tabela, sempre há risco de colisão. Colisões deve ser tratadas

Construindo uma tabela Hash com Vetores A utilização de Hashing envolve: Computar a função de transformação Tratar colisões

Construindo uma tabela Hash com Vetores Colisões Ocorrem quando h(ki) = h(kj) para algum ki<>kj Ou seja: duas chaves distintas endereçam para uma mesma entrada na tabela Colisões são praticamente inevitáveis utilizando hashing (exceto utilizando hashing perfeito)

Construindo uma tabela Hash com Vetores Uma função hash (h) deve: Mapear chaves em inteiros entre 0 e N-1, onde N é o tamanho da tabela. Ser de computação simples Gerar entradas para a tabela com igual probabilidade

Construindo uma tabela Hash com Vetores Função hash com operador resto h(k) = k mod N N é o tamanho da tabela K é um inteiro correspondente a chave de pesquisa Idealmente N deve ser um número primo

Construindo uma tabela Hash com Vetores Exemplo considerando que a chave de pesquisa é um string: Int h (char * chave){ int i,soma=0; for(i=0;i<strlen(chave);i++) { soma+=abs(chave[i]); } return soma%MAXTAB;

Construindo uma tabela Hash com Vetores Considere uma tabela com registros contendo o nome e o telefone de uma pessoa: #define MAX 1000 #define true 1 #define false 0 typedef struct { char nome[20]; char tel[20]; int ocupado; } Elemento; Elemento tabHash[MAX]; InicializaTabHash(Elemento tabHash[], int size){ Int i; for(i=0;i<size;i++) tabHash[i].ocupado = false; } Inserindo na Tabela void create(Elemento tabHash[], Elemento e) { int pos; pos = h(e.nome); If (tabHash[pos].ocupado == false) { tabHash[pos] = e; tabHash[pos].ocupado = true; } else{ printf(“ocorreu uma colisão”);

Construindo uma tabela Hash com Vetores Recuperando um elemento: Elemento read (Elemento tabHash[], char *chave) { int pos; pos = h(chave); If (tabHash[pos].ocupado == true) { if ( (strcmp(tabHash[pos].nome, chave) ==0) { return tabHash[pos]; } Atualizando um elemento Elemento update (Elemento tabHash[],Elemento e) { int pos; pos = h(e.nome); If (tabHash[pos].ocupado == true) if ( (strcmp(tabHash[pos].nome, chave) ==0) tabHash[pos].telefone = e.telefone; } Excluindo um elemento Elemento delete (Elemento tabHash[], char *chave) { pos = h(chave); tabHash[pos].ocupado = false;

Construindo uma tabela Hash com Vetores Colisões Paradoxo do aniversário: para um grupo de mais 23 pessoas escolhidas ao acaso, a chance de que duas pessoas façam aniversário no mesmo dia é maior que 50%. Logo: em uma função que enderece 23 chaves em uma tabela com 365 entradas, a probabilidade de que haja colisões é de 50%

Tratamento de Colisão Solução 1: Cada Entrada da tabela conterá uma lista encadeada Todos os registros com chaves que endereçam para uma mesma entrada na tabela são guardadas em uma mesma lista linear Análise: Considerando que qualquer item tem igual probabilidade de ser endereçado para qualquer entrada da Tabela temos que: O comprimento esperado de cada lista é N/m, onde n é o numero de itens e M o tamanho da tabela

{ Tratamento de Colisão h(k) 1 2 .. N-1 elemento elemento null null Índice plista 1 2 .. N-1 elemento elemento null null h(k) elemento elemento null null

Tratamento de Colisão -- listas encadeadas Estruturas: #define MAX 1000 typedef struct { char nome[20]; char telefone[10]; } Elemento; typedef struct noLista{ Elemento e; struct noLista* prox; }noLista; typedef noLista * Lista; typedef Lista *TabHash; Implementação das operações de inserção e pesquisa em uma ÚNICA LISTA: void insereNaLista(Lista *l, Elemento e){ .. } Elemento pesquisaNaLista(Lista l, char *chave){

Tratamento de Colisão -- listas encadeadas Implementação das operações da tabela Hash void inicializaTabHash(TabHash tab, int size) { int register i; *tab = malloc(size*sizeof(Lista)); for (i=0;i<size;i++) { (*tab)[i] = NULL; } // funcao hash. Tomando MAX como tamanho da tabela int h (char * chave){ int soma=0; while (*chave) { soma+=abs(*chave); chave++; return soma%MAX; Funções create e read: // função create void create(TabHash tab, Elemento e) { int pos; pos = h(e.nome); insereNaLista(&tab[pos], e); } // função read Elemento read (TabHash tab, char *chave) { pos = h(chave); return pesquisaNaLista(tab[pos],chave);

Tratamento de Colisão -- listas encadeadas Uso de listas encadeadas para tratamento da colisão O acesso a um registro da tabela custa O(1+N/M) 1 Representa o acesso a entrada da tabela N/M é o tempo para percorrer a lista

Tratamento de Colisão – Open Addressing Se o número de registros N a ser armazenado puder ser estimado e for menor que M pode-se usar os lugares vazios na tabela para alocar itens em colisão Neste método, quando uma chave é endereçada para uma entrada que já esteja ocupada uma sequência de localizações alternativas é definida Esta seqüência é geralmente obtido na vizinhança da posição calculada pela função Hash.

Análise Exemplo: Hashing Linear Análise: hj = (h(x)+j) mod M, 1 <=j<=M-1 Análise: Se a = n/M é o fator de carga da tabela (ocupação), o custo para uma pesquisa com sucesso é: C(n) = ½ (1 + 1/(1-a)) Uma desvantagem deste métodos é o possível agrupamento com a degradação do desempenho do mesmo