Post on 09-Dec-2018
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 depesquisa, sem preocupação com o tempo necessário para estruturar oarquivo.
Algoritmos de Pesquisa ⇒ Tipos Abstratos de Dados
É importante considerar os algoritmos de pesquisa como tiposabstratos de dados, com um conjunto de operações associado a umaestrutura de dados, de tal forma que haja uma independência deimplementaçã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 outraspalavras, 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 econquista.
Pesquisa em tabela pode ser mais eficiente ⇒ Se registros foremmantidos em ordem
Para saber se uma chave está presente na tabela1. 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 tabela3. 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 dessaapresentaçã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 doexercí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