Pesquisa sequencial e pesquisa binária

Documentos relacionados
Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

6. Pesquisa e Ordenação

Algoritmos de Busca. Profº Carlos Alberto T. Batista

ORDENAÇÃO E BUSCA 1. MÉTODOS DE ORDENAÇÃO

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Informática Parte 17 Prof. Márcio Hunecke

5. Algoritmos de Ordenação

7. Introdução à Complexidade de Algoritmos

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

7. Introdução à Complexidade de Algoritmos

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

4. Algoritmos de Busca em Vetores

AULA 13. Algoritmos p.526/582

Ordenação e Pesquisa

Análise e Complexidade de Algoritmos

ALGORITMOS AVANÇADOS. UNIDADE III Algoritmo de Ordenação por Intercalação (Mergesort) Luiz Leão

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

Fabio G. Cozman, Thiago Martins 2017

Algoritmos de Ordenação

Programação imperativa

Algoritmos de ordenação Ordenação rápida ( Quicksort )

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Tópicos Avançados em Algoritmos - exercícios de Prog. Din. com correcção parcial

INF111 Programação II Aulas 11, 12, 13 Ordenação

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Análise de Algoritmos Estrutura de Dados II

Aula 07: Algoritmos de busca e Listas encadeadas

Introdução Métodos de Busca Parte 1

Algoritmos e Estruturas de Dados LEE 2013/2014. popular devido à facilidade de implementação e eficiência

Algoritmos de ordenação: Inserção e Shellsort

Árvores Binárias de Busca

Análise de complexidade

QuickSort. Algoritmos e Estruturas de Dados Verão Cátia Vaz 1

Análise e Complexidade de Algoritmos

Pesquisa e Ordenação

Projeto e Análise de Algoritmos

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Algoritmos e Estruturas de Dados I Aula 06 Custos de um algoritmo

MCTA028 Programação Estruturada Aula 20 Exercícios de custos de um algoritmo

Universidade da Madeira. 1. Recursão. 3. Busca. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2

Algoritmos de ordenação Quicksort

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Programação de Computadores Ordenação de Arranjos

Algoritmos de Ordenação

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Aprendendo a Programar Programando numa Linguagem Algorítmica Executável (ILA)

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

Análise de algoritmos

Capítulo 14. Ordenação e pesquisa. Bubblesort. Alguns algoritmos de ordenação e pesquisa Medição do tempo de execução de um programa

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

Complexidade de Algoritmos

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

Ordenação Externa. Ordenação Externa. Ordenação Externa. Ordenação Externa

Análise de Algoritmos

Mediana. Aula 09. Menor. i-ésimo menor elemento. Algoritmo de Seleção. -ésimo menor elemento. Mediana é o n+1. -ésimo menor ou o n+1

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

Projeto e Análise de Algoritmos

AED2 - Aula 11 Problema da separação e quicksort

Transcrição:

Pesquisa sequencial e pesquisa binária Armando Matos Departamento de Ciência de Computadores Universidade de Porto 2008

2 problemas importantes... Pesquisa: Procurar um valor numa lista ou, por exemplo, num ficheiro pesquisa 5 em [8,2,1,5,2,6] True Ordenação: ordenar uma lista. Exemplo, ordem não decrescente: [8,2,1,5,2,6] [1,2,2,5,6,8]

Outline Pesquisa

Pesquisa sequêncial

Pesquisa sequêncial Seja x: o valor que se vai procurar a: a lista onde se vai procurar x; índices de a: 0 a n 1. procura(x,a) bool Método: x é comparado sucessivamente com a[0], a[1],..., a[n-1]. Se x for igual a algum dos a[i], retorna-se True. Senão, retorna-se False.

Pesquisa sequêncial, função em python # p r o c u r a x na l i s t a a d e f p r o c u r a ( x, a ) : n=l e n ( a ) i =0 w h i l e i <= n 1: i f x==a [ i ] : r e t u r n i=i +1 r e t u r n F a l s e True

Pesquisa sequêncial, método da sentinela Uma variação do método anterior... função procura(x,a): Inicialmente x é colocado no fim da lista, Ex: x=9, a=[5,10,2,4,2] a=[5,10,2,4,2,9] A comparação é mais simples: enquanto x!= a[i] A parte interna do ciclo é apenas: i = i+1 Seja n o valor inicial de len(a). Se o ciclo acaba com i=n, retorna False Se o ciclo acaba com i<n, retorna True

Método da sentinela, função em python Nesta versão retorna-se i tal que x=a[i] ou -1 se x não está na lista. 1 d e f p r o c u r a ( x, a ) : 2 n=l e n ( a ) 3 a. append ( x ) 4 i =0 5 w h i l e x!=a [ i ] : 6 i=i +1 7 i f i==n : 8 r e t u r n 1 9 r e t u r n i Note-se que o ciclo (onde a função passa mais tempo) é constituído apenas pelas linhas 5 e 6.

Eficiência da pesquisa sequêncial Vamos usar como medida de eficiência no tempo de execução o número c(n) de comparações entre x e a[i] (linha 5 da função anterior)

Eficiência da pesquisa sequêncial, I Para a função com sentinela : Número de comparações, se x está na lista Melhor caso: c(n) = 1 Pior caso: c(n) = n Caso médio: c(n) = (n + 1)/2 Para o caso médio, admitiu-se que x pode ser, com igual probabilidade, um dos n elementos da lista.

Eficiência da pesquisa sequêncial, II Número de comparações, Se x não está na lista: Melhor caso: c(n) = n + 1 Pior caso: c(n) = n + 1 Caso médio: c(n) = n + 1

Pesquisa binária

Pesquisa binária I Se a lista a está ordenada suponhamos por ordem crescente há algoritmos muito mais eficientes de procurar x: procura(x,a): x é procurado entre os índices i1 e i2 (extremos incluídos); Seja n=len(a). Inicialmente faz-se i1=0, i2=n-1. Repetidamente, calcula-se o ponto médio m=(i1+i2)/2 (divisão inteira) e Se x<a[m] i2=m-1 Se x>a[m] i1=m+1 Se x==a[m] retorna m Se o intervalo [i1,i2] acaba por ficar vazio (i1>i2), x não está na lista: retorna -1.

Pesquisa binária, função em python, versão iterativa 1 d e f pb ( x, a ) : 2 n = l e n ( a ) 3 i 1 = 0 4 i 2 = n 1 5 ( ) w h i l e i 1 <= i 2 : 6 m = ( i 1+i 2 )/2 7 i f x < a [m] : 8 i 2 = m 1 9 e l i f x > a [m] : 10 i 1 = m+1 11 e l s e : 12 # v e r i f i c a se x == a [m] 13 r e t u r n m 14 r e t u r n 1

Notas sobre a correcção de algoritmos Exercício: Escreva um invariante de ciclo apropriado à demonstração dacorrecção do algoritmo e válido antes do teste do ciclo - linha (*). Exercício: Escreva uma versão recursiva do mesmo algoritmo.

Notas sobre a correcção de algoritmos Muitas vezes é vantajoso dividir as demonstrações de correcção em 2 partes: Correcção parcial de um algoritmo: se o algoritmo terminar, a resposta está correcta Terminação de um algoritmo: o algoritmo termina (ver La Palisse, obras completas). correcção = correcção parcial + terminação

Pesquisa binária correcção da função Notas sobre a correcção da função de pesquisa binária: Invariante de ciclo : se x está na lista está entre os índices i1 e i2, extremos incluídos. Início: o invariante de ciclo fica verdadeiro com as atribuições das linhas 2-4. O invariante de ciclo mantém-se verdadeiro se o ciclo continuar, isto é, quando se verificam as condições das linhas 7 ou 9. Logo: no teste da linha 5 verifica-se o invariante de ciclo. Se a linha 13 for executada, x está na lista, na posição m Se o ciclo acabar (i1>i2), pela manutenção do invariante do ciclo, x não está na lista.

Pesquisa binária terminação da função Notas sobre a terminação da função: Os índices em que x pode estar são i1, i1+1,..., i2. Seja num=i2-i1+1 o número desses índices. A prova de terminação é baseada no facto de num diminuir de cada vez que o teste das linhas 7 e 9 é efectuado e isso prova-se com os seguintes factos i1 m i2 onde m resulta da atribuição m=(i1+i2)/2. A atribuição i2=m-1 (linha 8) reduz num, pois, com o valor inicial da i2, m 1 < m i2 A atribuição i1=m+1 (linha 10) reduz num, pois, com o valor inicial da i1, i1 m < m + 1

Eficiência da pesquisa binária Vamos usar como medida de eficiência no tempo de execução o número c(n) de comparações entre x e a[i], contando as linhas 7 e 9 como uma só comparação, (comparação entre x e a[m]) Vamos determinar o número de comparações no pior caso (quando x não está na lista)

Eficiência da pesquisa binária Para simplificar, supomos que n=len(a) é da forma n = 2 p 1. Após uma divisão a meio, o número de índices em que x pode estar passa de n = 2 p 1 a n = 2 p 1 1. Por exemplo, 15 7 3 1 0

Eficiência da pesquisa binária Para simplificar, supomos que n=len(a) é da forma n = 2 p 1. Após uma divisão a meio, o número de índices em que x pode estar passa de n = 2 p 1 a n = 2 p 1 1. Por exemplo, 15 7 3 1 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0... 14

Eficiência da pesquisa binária Para simplificar, supomos que n=len(a) é da forma n = 2 p 1. Após uma divisão a meio, o número de índices em que x pode estar passa de n = 2 p 1 a n = 2 p 1 1. Por exemplo, 15 7 3 1 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0... 14 8... 14

Eficiência da pesquisa binária Para simplificar, supomos que n=len(a) é da forma n = 2 p 1. Após uma divisão a meio, o número de índices em que x pode estar passa de n = 2 p 1 a n = 2 p 1 1. Por exemplo, 15 7 3 1 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0... 14 8... 14 8... 10

Eficiência da pesquisa binária Para simplificar, supomos que n=len(a) é da forma n = 2 p 1. Após uma divisão a meio, o número de índices em que x pode estar passa de n = 2 p 1 a n = 2 p 1 1. Por exemplo, 15 7 3 1 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0... 14 8... 14 8... 10 9... 9

Eficiência da pesquisa binária Para simplificar, supomos que n=len(a) é da forma n = 2 p 1. Após uma divisão a meio, o número de índices em que x pode estar passa de n = 2 p 1 a n = 2 p 1 1. Por exemplo, 15 7 3 1 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0... 14 8... 14 8... 10 9... 9 9... 8 =

Eficiência da pesquisa binária Para simplificar, supomos que n=len(a) é da forma n = 2 p 1. Após uma divisão a meio, o número de índices em que x pode estar passa de n = 2 p 1 a n = 2 p 1 1. Por exemplo, 15 7 3 1 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0... 14 8... 14 8... 10 9... 9 9... 8 = 0... 14 O número de divisões a meio, que é igual ao número de comparações, é, neste caso, igual a 4 = log(n + 1). No caso geral, o número de comparações não excede log(n) + 1.

Eficiência da pesquisa binária Número de comparações no pior caso. Exemplo para n = 10 8, t = 1µseg (tempo associado a cada comparação) Pesquisa sequêncial: c(n) = n, t = 100seg, quase 2 minutos. Pesquisa binária: c(n) log(n), t 27µseg! Conclusão: a pesquisa binária é muito mais rápida que a pesquisa sequêncial.

fim