Algoritmos de pesquisa. Tabelas de dispersão/hash



Documentos relacionados
Algoritmos de pesquisa. Tabelas de dispersão/hash

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

TABELAS DE DISPERSÃO/HASH

Tabela de símbolos: tabelas de espalhamento

Tabelas Hash. Jeane Melo

Hashing Letícia Rodrigues Bueno

Hashing. Rafael Nunes LABSCI-UFMG

Tabelas de Espalhamento

Árvores Binárias de Busca

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

Hashing. Estruturas de Dados. Motivação

Hashing (Tabela de Dispersão)

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

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

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

Árvores Binárias de Busca

Árvores B. Hashing. Estrutura de Dados II Jairo Francisco de Souza

2ª Lista de Exercícios

Pesquisa Sequencial e Binária

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

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

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

HASHING. Katia Guimarães. 1

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

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Estruturas de Dados Pilhas, Filas e Deques

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador

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

Busca. Pesquisa sequencial

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

Notas da Aula 17 - Fundamentos de Sistemas Operacionais

Análise de Algoritmos: Melhor caso, pior caso, caso médio

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º

EAD Árvore árvore binária

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

DAS5102 Fundamentos da Estrutura da Informação

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

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

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

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

Métodos de Pesquisa 472

Algoritmos de Busca em Tabelas

UNIVERSIDADE FEDERAL DE SANTA MARIA

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

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

Índices* Professora Rosane Minghim. * Baseado no material de Leandro C. Cintra e M. C. F. de Oliveira. Fonte: Folk & Zoelick, File Structures.

INF 1007 Programação II

implementação Nuno Ferreira Neves Faculdade de Ciências de Universidade de Lisboa Fernando Ramos, Nuno Neves, Sistemas Operativos,

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

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

SHA(SECURE HASH ALGORITHM - ALGORITMO HASH SEGURO) BRUNO KAMINO YAMAMOTO ALEXANDRE FLEURY

Sistemas Distribuídos: Princípios e Algoritmos Introdução à Análise de Complexidade de Algoritmos

Sumário. 5COP096 Teoria da Computação Aula 8 Pesquisa em Memória Primária

Estruturas de Dados I

Prof. Daniela Barreiro Claro

PostgreSQL Performance

Pilhas. Profa Morganna Diniz

Curso de Instalação e Gestão de Redes Informáticas

Exercícios Teóricos Resolvidos

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

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

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

Batalha Naval Algoritmos de Busca. Correlações curriculares Matemática: Números: maior que, menor que, iguais a.

Conversões em Sistemas de Numeração. José Gustavo de Souza Paiva

Banco de Dados I Módulo V: Indexação em Banco de Dados. (Aulas 1, 2 e 3) Clodis Boscarioli

Unidade 5 Armazenamento e Indexação

Complexidade de Algoritmos

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Sistemas Operacionais

Bases de Dados. Parte IX: Organização Física dos Dados

Sistemas Operacionais

Pesquisa digital. Algoritmos e Estruturas de Dados II

Projeto e Análise de Algoritmos. Profa. Juliana Kaizer Vizzotto. Projeto e Análise de Algoritmos - Aula 1

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

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

Fundamentos de Sistemas Operacionais

struct LISTA item quant

Linguagem C: Árvores Binarias

Prof. Daniela Barreiro Claro

i a[i]

Programação 2. Trabalho Prático P4B. Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux.

Tipos de Dado Abstrato: Listas, Filas e Pilhas

Árvores de Suporte de Custo Mínimo

Análise de complexidade

Figura 13.1: Um exemplo de árvore de diretório.

Sistema de Arquivos FAT

Filas: conceitos e implementações

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

Árvores Binárias Balanceadas

Organização e Arquitetura de Computadores I

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

Figura 1 Busca Linear

Algoritmos e Estrutura de Dados III. Árvores

Sistemas de Arquivos. André Luiz da Costa Carvalho

BC1424 Algoritmos e Estruturas de Dados I. Aula 16: Árvores (introdução) Prof. Jesús P. Mena-Chalco. jesus.mena@ufabc.edu.br

Prof. Bruno Calegaro

FACULDADE DE IMPERATRIZ - FACIMP BACHARELADO EM SISTEMAS DE INFORMAÇÃO ESTRUTURA DE DADOS 2. Vieira Lima Junior. Everson Santos Araujo

JavaScript. JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos.

Transcrição:

Algoritmos de pesquisa Tabelas de dispersão/hash

Introdução Motivação: Considerar o problema de pesquisar um determinado valor num vetor (array). Se o vetor não está ordenado, a pesquisa requer O(n) de complexidade. Se o vetor está ordenado, pode-se fazer a pesquisa binária que requer uma complexidade de O(log n). Não parece haver melhor maneira de resolver o problema com custos melhorados.

Ideia: Introdução Poderia haver maneira de resolver o problema em O(1). Se o vetor estiver organizado de uma determinada maneira. Solução: Arranjar uma função mágica que, dado um determinado valor a pesquisar, nos diga exatamente a posição exata no vetor. Esta função é chamada função de dispersão/hash.

Introdução Complexidade ideal O(1) Vetor A[i] de 0 a 65.535 (16 bits) inicializado a zeros Cada inserção de um número k seria: A[k]++ Cada remoção de um número k seria: A[k]-- A[k] representa o número de vezes que o número k foi inserido Para procurar temos que fazer find(k); se A[k] > 0 está encontrado

Introdução Problemas encontrados Tamanho do vetor Se o inteiro for 16 bits dá um vetor com 65.536, mas se tivermos um com 32 bits dá 4.294.967.296, o que é incomportável. O uso de strings Se tivermos strings em vez de inteiros não dá para indexar num vetor, porque A[ Ana ] não existe.

Introdução Resolução do problema dos vetores grandes Usar uma função que mapeie grandes números ou strings transformados em números mais pequenos ou manejáveis Esta função é chamada de Hash ou de dispersão

Tabela de Hash As tabelas de hash são um tipo de estruturação criado para o armazenamento de informação, e são uma forma extremamente simples, fácil de se implementar e, intuitiva para se organizar grandes quantidades de dados. Possui como ideia central a divisão do universo de dados a ser organizado em subconjuntos mais facilmente geríveis. A estruturação da informação em tabelas de hash visa principalmente permitir armazenar e procurar rapidamente grande quantidade de dados.

Tabela de Hash As tabelas de hash são constituídas por 2 conceitos fundamentais: Tabela de Hash: estrutura que permite o acesso aos subconjuntos. Função de Hash: função que realiza um mapeamento entre os valores de chaves e as entradas na tabela.

Tabela de Hash Criar um critério simples para dividir este universo em subconjuntos com base nalguma qualidade do domínio das chaves Possuir um índice que permita encontrar o início do subconjunto certo, depois de calcular o valor de hash. Isto é atabeladehash. Saber em qual subconjunto procurar e colocar uma chave indicar quantos subconjuntos se pretende criar uma regra de cálculo que, dada uma chave, determine em que subconjunto se deve procurar pelos dados com esta chave ou colocar estes dados (caso seja um novo elemento). Isto é chamado defunçãodehash.

Tabela de Hash Gerir estes subconjuntos bem menores com um método simples: Possuir uma estrutura ou um conjunto de estruturas de dados para os subconjuntos. Existem duas filosofias: hashing fechado (ou de endereçamento aberto) ou o hashing aberto (ou encadeado). Alguns dos problemas que se colocam quando usamos tabelas de hash são: determinar uma função de hash que minimize o número de colisões; obter os mecanismos eficientes para tratar as colisões.

Funções de Hash - exemplos Númerosx(chave) de 0 a 99 (dois dígitos) tam tamanho da tabela Pode-se construir uma função que coloque x no vetor em termos do algarismo das dezenas. f = x / tam (/ = divisão inteira) Ou pode-se construir uma função que coloque x no vetor em termos do algarismo das unidades. f = x % tam (% = resto da divisão)

Função de Hash Exemplo de uma função de Hash: int hash (int key,int tam) { return (key % tam); } Objetivos das funções de Hash: deve ser eficiente. deve distribuir todos os elementos uniformemente por todas as posições da tabela.

Função de Hash para strings - exemplos Método normal: int hash (char key[],int tam) { int valhash = 0, k = 0; while (key[k]!= '\0') { valhash = valhash + int(key[k]); k++; } return (valhash % tam); }

Função de Hash para strings Usando a regra de Horner: int hash (char key[],int tam) { int valhash = 0, a = 127, k = 0; while (key[k]!= '\0') { valhash = valhash * a + int(key[k]); k++; } return (valhash % tam); }

Colisões Quando a função de Hash é imperfeita poderão existir dois valores a serem colocados na mesma posição do vetor. A isto chama-se uma colisão. As colisões são normalmente tratadas como quem chega primeiro serve-se; isto é, o primeiro elemento a chegar a uma posição fica com ela. Terá de se arranjar uma solução eficiente para se determinar o que se deve fazer com o segundo valor que deveria ser colocado na mesma posição.

Colisões O que fazer quando dois valores diferentes tentam ocupar a mesma posição? Solução 1 (hashing fechado ou endereçamento aberto): procura a partir dessa posição uma posição vazia. Solução 2: usar uma segunda função de hash, uma terceira, uma quarta, Solução 3 (hashing aberto ou encadeamento separado): usa a posição do vetor como cabeça (head) de uma lista que vai conter todas as colisões dessa posição.

Factorde ocupação da tabela λ n = número de elementos da tabela. dim = dimensão da tabela. λ = n / dim λ deve ser inferior a 1.

Hashing fechado Suponha que quer adicionar seagull à tabela de Hash. Suponha também que: hash(seagull) = 143 table[143] está ocupada table[143]!= seagull table[143+1] está ocupada table[143+1]!= seagull table[143+2] está vazia

Hashing fechado Suponha que quer adicionar seagull à tabela de Hash. Suponha também que: hash(seagull) = 143 table[143] está ocupada table[143]!= seagull table[143+1] está ocupada table[143+1]!= seagull table[143+2] está vazia Então, colocar seagull em 145. Foi utilizada a sondagem linear.

Hashing fechado Suponha que quer adicionar hawk à tabela de Hash. Suponha também que: hash(hawk) = 143 table[143] está ocupada table[143]!= hawk table[143+1] está ocupada table[143+1] == hawk O hawk já está na tabela. Então, não fazer nada.

Hashing fechado Suponha que quer adicionar cardinal à tabela de Hash. Suponha também que: hash(cardinal) = 147 a última posição é 148 table[147] está ocupada table[148] está ocupada Solução Tratar a tabela como circular: a seguir a 148 vem o 0. Assim, cardinal vai para a posição 0.

Hashing fechado Problemas da sondagem linear Existência de blocos contíguos de posições ocupadas com grandes dimensões (em geral quando λ > 0,5) Clusters. Quanto maiores os blocos ficam, mais tendência têm para crescer. A sondagem é igual para elementos que colidem.

Hashing fechado Suponha que quer adicionar seagull à tabela de Hash. Suponha também que: hash(seagull) = 143 table[143] não está vazia table[143]!= seagull table[143+1 2 ]!= seagull table[143+2 2 ]!= seagull table[143+3 2 ]!= está vazia Então, colocar seagull em 152. Foi utilizada a sondagem quadrática.

Hashing fechado Problemas da sondagem quadrática Cada sondagem tenta uma nova posição. Se tivermos o tamanho do vetor, tam = 16, calha sempre nas posições 1, 2, 4, 9 entrando num ciclo infinito.

Hashing fechado Resolução do problema tam tem de ser número primo O fator λ tem que ser >= 0,5 Ao atingir λ = 0.5 pode-se aumentar a tabela para o próximo número primo, de seguida pega-se nos valores da tabela e passamse para a nova aplicando de novo a função de hash(x) A este método chama-se o método de rehash(x).

Problema da remoção. Suponha também que: hash(9) = 2 hash(24) = 3 hash(39) = 4 hash(10) = 3 hash(16) = 2 Remove(24) Hashing fechado

Hashing fechado Não existe nada na posição 3. hash(10) = 3. Logo, número 10 não existe no vetor. O que é falso.

Hashing fechado - resolução do problema Cria-se uma estrutura que assinale cada posição: Livre (vazia e nunca ocupada) Ocupada Removida (vazia mas já ocupada) Pesquisar/remover: Termina quando encontra o objeto Termina quando encontra uma posição livre Continua a pesquisa quando encontra uma posição removida Inserir (insere o objeto quando encontra): uma posição assinalada como livre ou removida.

Hashing aberto A estruturação dos dados é talvez a forma mais intuitiva de se implementar o conceito de Hashing Consiste em ter um vetor de apontadores, com dimensão N, em que cada elemento do vetor contém uma ligação para uma lista dos elementos a guardar A pesquisa de um elemento efetua-se da seguinte forma: A partir de uma chave, calcular qual o elemento do vetor é a cabeça da lista que se pretende Usando um qualquer algoritmo para o efeito, pesquisar o elemento dentro daquela lista.

Hashing aberto Exemplo 1 Armazenar os elementos: 19, 26, 33, 70, 79, 103 e 110. Usando a função de hash: hash(x) = x % 10 Os valores das funções de hash são os seguintes: hash(19) = 9 hash(26) = 6 hash(33) = 3 hash(70) = 0 hash(79) = 9 hash(103) = 3 hash(110) = 0

A tabela de hash é a seguinte: Hashing aberto Exemplo 1 0 1 2 3 4 5 6 7 8 9 70 33 26 19 110 103 79

Hashing aberto Exemplo 2 Cada elemento do vetor é um apontador para uma lista de estruturas com o mesmo valor da função de hash. Supondo que o vetor tem tamanho tam = 13 e que a função de hash é a que consta na tabela que se segue Chave A,B C,D E,F G,H I,J K,L M,N O,P Q,R S,T U,V X,Y W,Z Hash 0 1 2 3 4 5 6 7 8 9 10 11 12 calcular os valores de hash para as seguintes chaves: Alce, Burro, Gato, Hiena, Pato, Orca e Tigre.

A tabela de hash é a seguinte: Hashing aberto Exemplo 2 0 1 2 3 4 5 6 7 8 9 10 11 12 Burro Gato Pato Tigre Alce Hiena Orca

Hashing aberto - propriedades Reduz o número de comparações, quando comparado com a pesquisa sequencial Necessidade de espaço em memória para armazenar o vetor de listas

Vantagens e desvantagens Dispersão aberta (DA) vs. Fechada (DF) Suporta a primitiva de remoção As listas de colisão não se cruzam O erro por defeito do pré-dimensionamento não é tão grave Dispersão fechada vs. aberta Se a tabela estiver em ficheiro poupam-se muitos acessos com a sondagem linear, porque em geral os elementos que colidem estão fisicamente próximos.

Vantagens e desvantagens Vantagens da Dispersão A complexidade das primitivas suportadas (pesquisa, inserção e remoção na DA), no caso esperado é constante. A técnica é eficiente e é só depende do fator de ocupação e da qualidade das funções (na DF). Problemas da Dispersão Não é uma estrutura dinâmica (o redimensionamento é necessário) Não suporta primitivas que se baseiam em relações de ordem dos elementos (mínimo, máximo, percurso ordenado). A complexidade das primitivas suportadas (pesquisa, inserção e remoção na DA), no pior caso é linear no nº de elementos da tabela.