Pesquisa em Memória Primária Prof. Jonas Potros
Pesquisa em Memoria Primária Estudo de como recuperar informação a partir de uma grande massa de informação previamente armazenada. A informação é dividida em registros. Cada registro possui uma chave para ser usada na pesquisa. Objetivo da pesquisa: Encontrar uma ou mais ocorrências de registros com chaves iguais à chave de pesquisa. Pesquisa com sucesso X Pesquisa sem sucesso
Pesquisa em Memoria Primária Conjunto de registros ou arquivos TABELAS Tabela: Associada a entidades de vida curta, criadas na memória interna durante a execução de um programa. Arquivo: Geralmente associado a entidades de vida mais longa, armazenadas em memória externa. Distinção não é rígida: tabela: arquivo de índices arquivo: tabela de valores de funções.
Escolha do Método de Pesquisa Depende principalmente: 1. Quantidade dos dados envolvidos. 2. Arquivo estar sujeito a inserções e retiradas frequentes. se conteúdo do arquivo é estável é importante minimizar o tempo de pesquisa, sem preocupação com o tempo necessário para estruturar o arquivo.
Algoritmos de Pesquisa Tipos Abstratos de Dados É importante considerar os algoritmos de pesquisa como tipos abstratos de dados, com um conjunto de operações associado a uma estrutura de dados, de tal forma que haja uma independência de implementação para as operações. Operações mais comuns: 1. Inicializar a estrutura de dados. 2. Pesquisar um ou mais registros com determinada chave. 3. Inserir um novo registro. 4. Retirar um registro especifico. 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.
Pesquisa sequencial ou linear Método de pesquisa mais simples: a partir do primeiro registro, pesquise sequencialmente até encontrar a chave procurada; então pare. Armazenamento de um conjunto de registros por meio do tipo estruturado arranjo.
Pesquisa sequencial ou linear 1. Posicionar-se no início do arquivo 2. Se registro atual = registro desejado Sucesso, Terminar; 3. Se registro atual > registro desejado Fracasso, Terminar; 4. Se registro atual < registro desejado Avançar registro; 5. Se não for final de arquivo Avance o registro e volte ao passo 2 6. Fracasso, Terminar;
Pesquisa sequencial ou linear - Exemplo 1º passo inicialização i = 0; encontrado = 0; /*Falso*/ 2º passo busca while (i < TAMANHO &&!encontrado) { if (vetor[i] == valor) { encontrado = 1; /*Verdadeiro*/ } else { i++; } }
Pesquisa sequencial ou linear- Exemplo 3º passo tratamento do resultado if (encontrado) { printf ("Valor esta na posicao", i); } else { printf ("Valor não encontrado",valor); }
Pesquisa sequencial ou linear Análise Quanto tempo a busca sequencial demora para executar? Em outras palavras, quantas vezes a comparação valor == vetor[i] é executada? Caso valor não esteja presente no vetor, n vezes. Caso valor esteja presente no vetor: 1 vez no melhor caso (valor está na primeira posição). n vezes no pior caso (valor está na última posição). n/2 vezes no caso médio.
Pesquisa Binária Algoritmo de busca em tabelas que segue o paradigma de divisão e conquista. Pesquisa em tabela pode ser mais eficiente Se registros forem mantidos em ordem Para saber se uma chave está presente na tabela 1. Compare a chave com o registro que está na posição do meio da tabela. 2. Se a chave é menor então o registro procurado está na primeira metade da tabela 3. Se a chave é maior então o registro procurado está na segunda metade da tabela. 4. Repita o processo até que a chave seja encontrada, ou fique apenas um registro cuja chave é diferente da procurada, significado uma pesquisa sem sucesso.
Pesquisa Binária Passo 1: inicialização int direita, esquerda, meio; encontrado = 0; /*Falso*/ esquerda = 0; direita = TAMANHO - 1;
Pesquisa Binária Passo 2: busca while(esquerda<=direita &&!encontrado){ meio=(direita + esquerda)/2; if (vetor[meio] == valor) encontrado = 1; /*Verdadeiro*/ else if (valor < vetor[meio]) direita = meio - 1; else esquerda = meio + 1; }
Pesquisa Binária Passo 3: tratamento do resultado if(encontrado){ printf ("Valor encontrado na posicao", meio); }else{ printf ("Valor não encontrado", valor); }
Pesquisa Binária - Análise A cada iteração do algoritmo, o tamanho da tabela é dividido ao meio. Logo: o número de vezes que o tamanho da tabela é dividido ao meio é cerca de log n. Ressalva: o custo para manter a tabela ordenada é alto: a cada inserção na posição p da tabela implica no deslocamento dos registros a partir da posição p para as posições seguintes. Consequentemente, a pesquisa binária não deve ser usada em aplicações muito dinâmicas
Atividade 1 Ordenar o vetor e aplicar as verificações do slide 7 dessa apresentação, na pesquisa sequencial para que seja encontrado o valor 1. 2 Apresentar as implementações das pesquisas sequencial e binária para que encontrem o elemento 8. 3 Implementação do algoritmo de busca binária de forma recursiva. 4 Apresente a média do tempo de execução dos dois algoritmos do exercícios 2 e faça suas conclusões. *Utilize esse vetor para fazer os testes 4 1 3 2 1 9 1 1 8 7 2 4 6 7 3 3 5 7 3 6 6 2 7 1