Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 3 Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 2 Introdução - Conceitos Básicos Introdução - Conceitos Básicos • Conjunto de registros ou arquivos ⇒ tabelas • Estudo de como recuperar informação a partir de uma grande massa de informação previamente armazenada. • Tabela: • A informação é dividida em registros . associada a entidades de vida curta, criadas na memória interna durante a execução de um programa. • Cada registro possui uma chave para ser usada na pesquisa. • Arquivo: • Objetivo da pesquisa: geralmente associado a entidades de vida mais longa, armazenadas Encontrar uma ou mais ocorrências de registros com chaves iguais à em memória externa. c have de pesquisa. • Distinção não é rígida: tabela: arquivo de índices • Pesquisa com sucesso X Pesquisa sem sucesso . arquivo: tabela de valores de funções. Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 1 Pesquisa em Memória Primária • Introdução - Conceitos Básicos • Pesquisa Digital – Trie • Pesquisa Sequencial – Patricia • Pesquisa Binária Pesquisa em Memória Primária ∗ • Transformação de Chave • Árvores de Pesquisa ( Hashing ) – Árvores Binárias de Pesquisa – Funções de Transformação sem Balanceamento – Listas Encadeadas – Árvores Binárias de Pesquisa – Endereçamento Aberto com Balanceamento ∗ Árvores SBB – Hashing Perfeito com or- Última alteração: 7 de Setembro de 2010 ∗ Transformações para Manu- dem Preservada tenção da Propriedade SBB Perfeito Usando – Hashing Espaço Quase Ótimo ∗ Transparências elaboradas por Fabiano C. Botelho, Israel Guerra e Nivio Ziviani
Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.1 7 Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 6 Pesquisa Sequencial Dicionário • Método de pesquisa mais simples: a partir do primeiro registro, • Nome comumente utilizado para descrever uma estrutura de dados pesquise sequencialmente até encontrar a chave procurada; então para pesquisa. pare. • Dicionário é um tipo abstrato de dados com as operações: • Armazenamento de um conjunto de registros por meio do tipo 1. Inicializa estruturado arranjo: 2. Pesquisa #define MAXN 10 3. Insere typedef long TipoChave; 4. Retira typedef struct TipoRegistro { TipoChave Chave; • Analogia com um dicionário da língua portuguesa: / ∗ outros componentes ∗ / – Chaves ⇐ ⇒ palavras } TipoRegistro; – Registros ⇐ ⇒ entradas associadas com cada palavra: typedef int TipoIndice; typedef struct TipoTabela { ∗ pronúncia TipoRegistro Item[MAXN + 1]; ∗ definição TipoIndice n; ∗ sinônimos } TipoTabela; ∗ outras informações Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5 Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 4 Algoritmos de Pesquisa ⇒ Tipos Abstratos de Dados Escolha do Método de Pesquisa mais Adequado a uma Determinada Aplicação • É importante considerar os algoritmos de pesquisa como tipos abstratos de dados , com um conjunto de operações associado a uma • Depende principalmente: estrutura de dados, de tal forma que haja uma independência de 1. Quantidade dos dados envolvidos. implementação para as operações. 2. Arquivo estar sujeito a inserções e retiradas frequentes. • Operações mais comuns: 1. Inicializar a estrutura de dados. Se conteúdo do arquivo é estável é importante minimizar o tempo de pesquisa, sem preocupação com o tempo necessário para 2. Pesquisar um ou mais registros com determinada chave. estruturar o arquivo 3. Inserir um novo registro. 4. Retirar um registro específico. 5. Ordenar um arquivo para obter todos os registros em ordem de acordo com a chave. 6. Ajuntar dois arquivos para formar um arquivo maior.
Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.1 11 Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.1 10 Pesquisa Sequencial: Análise Pesquisa Sequencial • Pesquisa com sucesso: • Utilização de um registro sentinela na posição zero do array : 1. Garante que a pesquisa sempre termina: melhor caso : C ( n ) = 1 se o índice retornado por Pesquisa for zero, a pesquisa foi sem pior caso : C ( n ) = n sucesso. caso m´ edio : C ( n ) = ( n + 1) / 2 2. Não é necessário testar se i > 0 , devido a isto: – o anel interno da função Pesquisa é extremamente simples: o • Pesquisa sem sucesso: índice i é decrementado e a chave de pesquisa é comparada C ′ ( n ) = n + 1 . com a chave que está no registro. • O algoritmo de pesquisa sequencial é a melhor escolha para o – isto faz com que esta técnica seja conhecida como pesquisa problema de pesquisa em tabelas com até 25 registros . sequencial rápida . Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.1 9 Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.1 8 Pesquisa Sequencial Pesquisa Sequencial • Pesquisa retorna o índice do registro que contém a chave x ; void Inicializa (TipoTabela ∗ T) { T >n = 0; } − • Caso não esteja presente, o valor retornado é zero. TipoIndice Pesquisa(TipoChave x, TipoTabela ∗ T) • A implementação não suporta mais de um registro com uma mesma { int i ; chave. T >Item[0].Chave = x; i = T >n + 1; − − • Para aplicações com esta característica é necessário incluir um do { i −− ;} while (T >Item[ i ].Chave != x); − return i ; argumento a mais na função Pesquisa para conter o índice a partir do } qual se quer pesquisar. void Insere(TipoRegistro Reg, TipoTabela ∗ T) { if (T >n == MAXN) − printf ("Erro : tabela cheia\n" ); else { T >n++; T >Item[T >n] = Reg; } − − − }
Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.3 15 Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.2 14 Árvores de Pesquisa Pesquisa Binária: Análise • A árvore de pesquisa é uma estrutura de dados muito eficiente para • A cada iteração do algoritmo, o tamanho da tabela é dividido ao meio. armazenar informação. • Logo: o número de vezes que o tamanho da tabela é dividido ao meio • Particularmente adequada quando existe necessidade de considerar é cerca de log n . todos ou alguma combinação de: • Ressalva: o custo para manter a tabela ordenada é alto: 1. Acesso direto e sequencial eficientes. a cada inserção na posição p da tabela implica no deslocamento dos 2. Facilidade de inserção e retirada de registros. registros a partir da posição p para as posições seguintes. 3. Boa taxa de utilização de memória. • Consequentemente, a pesquisa binária não deve ser usada em 4. Utilização de memória primária e secundária. aplicações muito dinâmicas. Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.2 13 Projeto de Algoritmos - Cap.5 Pesquisa em Memória Primária 5.2 12 Algoritmo de Pesquisa Binária Pesquisa Binária • Pesquisa em tabela pode ser mais eficiente ⇒ Se registros forem TipoIndice Binaria(TipoChave x, TipoTabela ∗ T) mantidos em ordem { TipoIndice i , Esq, Dir ; if (T >n == 0) − • Para saber se uma chave está presente na tabela return 0; 1. Compare a chave com o registro que está na posição do meio da else Pesquisa para a chave G: tabela. { Esq = 1; Dir = T >n; 1 2 3 4 5 6 7 8 − 2. Se a chave é menor então o registro procurado está na primeira D do A B C E F G H metade da tabela F { i = (Esq + Dir ) / 2; E G H 3. Se a chave é maior então o registro procurado está na segunda G if (x > T >Item[ i ].Chave) − H metade da tabela. Esq = i + 1; else Dir = i − 1; 4. Repita o processo até que a chave seja encontrada, ou fique } while (x != T >Item[ i ].Chave && Esq <= Dir ); − apenas um registro cuja chave é diferente da procurada, if (x == T >Item[ i ].Chave) return i ; else return 0; − significando uma pesquisa sem sucesso. } }
Recommend
More recommend