Metódos de Pesquisa em C

154 visualizações

Publicada em

Alguns métodos de pesquisa eficaz na linguagens C.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
154
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
1
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Metódos de Pesquisa em C

  1. 1. Pesquisa sequencial e pesquisa bin´ria a Armando Matos Departamento de Ciˆncia de Computadores e Universidade de Porto 2008
  2. 2. 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. ca Exemplo, ordem n˜o decrescente: a [8,2,1,5,2,6] → [1,2,2,5,6,8]
  3. 3. Outline Pesquisa
  4. 4. Pesquisa sequˆncial e
  5. 5. Pesquisa sequˆncial e 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: e x ´ comparado sucessivamente com a[0], a[1],. . . , a[n-1]. e Se x for igual a algum dos a[i], retorna-se True. Sen˜o, retorna-se False. a
  6. 6. Pesquisa sequˆncial, fun¸˜o em python e ca # p r o c u r a x na l i s t a a def procura (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 True i=i +1 return False
  7. 7. Pesquisa sequˆncial, m´todo da sentinela e e Uma varia¸˜o do m´todo anterior. . . fun¸˜o procura(x,a): ca e ca Inicialmente x ´ colocado no fim da lista, e 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] ca e A parte interna do ciclo ´ apenas: i = i+1 e 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
  8. 8. M´todo da sentinela, fun¸˜o em python e ca Nesta vers˜o retorna-se i tal que x=a[i] a ou -1 se x n˜o est´ na lista. a a 1 2 3 4 5 6 7 8 9 def procura (x , a ) : n=l e n ( a ) a . append ( x ) i =0 w h i l e x !=a [ i ] : i=i +1 i f i==n : r e t u r n −1 return i Note-se que o ciclo (onde a fun¸˜o “passa” mais tempo) ´ ca e constitu´ apenas pelas linhas 5 e 6. ıdo
  9. 9. Eficiˆncia da pesquisa sequˆncial e e Vamos usar como medida de eficiˆncia no tempo de execu¸˜o e ca o n´mero c(n) de compara¸˜es entre x e a[i] u co (linha 5 da fun¸˜o anterior) ca
  10. 10. Eficiˆncia da pesquisa sequˆncial, I e e Para a fun¸˜o com “sentinela”: ca N´mero de compara¸˜es, se x est´ na lista u co a Melhor caso: c(n) = 1 Pior caso: c(n) = n Caso m´dio: c(n) = (n + 1)/2 e Para o caso m´dio, admitiu-se que x pode ser, com igual e probabilidade, um dos n elementos da lista.
  11. 11. Eficiˆncia da pesquisa sequˆncial, II e e N´mero de compara¸˜es, Se x n˜o est´ na lista: u co a a Melhor caso: c(n) = n + 1 Pior caso: c(n) = n + 1 Caso m´dio: c(n) = n + 1 e
  12. 12. Pesquisa bin´ria a
  13. 13. Pesquisa bin´ria I a Se a lista a est´ ordenada – suponhamos por ordem crescente – h´ a a algoritmos muito mais eficientes de procurar x: procura(x,a): x ´ procurado entre os ´ e ı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 e (divis˜o inteira) e a 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 a est´ na lista: → retorna -1. a
  14. 14. Pesquisa bin´ria, fun¸˜o em python, vers˜o iterativa a ca a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 d e f pb ( x , a ) : n = len (a) i1 = 0 i 2 = n−1 ( ∗ ) w h i l e i 1 <= i 2 : m = ( i 1+i 2 ) / 2 i f x < a [m ] : i 2 = m−1 e l i f x > a [m ] : i 1 = m+1 else : # v e r i f i c a −s e x == a [m] return m r e t u r n −1
  15. 15. Notas sobre a correc¸˜o de algoritmos ca Exerc´ ıcio: Escreva um invariante de ciclo apropriado ` a demonstra¸˜o dacorrec¸˜o do algoritmo e v´lido antes do teste do ca ca a ciclo - linha (*). Exerc´ ıcio: Escreva uma vers˜o recursiva do mesmo algoritmo. a
  16. 16. Notas sobre a correc¸˜o de algoritmos ca Muitas vezes ´ vantajoso dividir as demonstra¸˜es de correc¸˜o em e co ca 2 partes: Correc¸˜o parcial de um algoritmo: se o algoritmo terminar, a ca resposta est´ correcta a Termina¸˜o de um algoritmo: o algoritmo termina (ver La ca Palisse, obras completas). correc¸˜o = correc¸˜o parcial + termina¸˜o ca ca ca
  17. 17. Pesquisa bin´ria – correc¸˜o da fun¸˜o a ca ca Notas sobre a correc¸˜o da fun¸˜o de pesquisa bin´ria: ca ca a Invariante de ciclo : se x est´ na lista est´ entre os ´ a a ındices i1 e i2, extremos inclu´ ıdos. In´ ıcio: o invariante de ciclo fica verdadeiro com as atribui¸˜es co das linhas 2-4. O invariante de ciclo mant´m-se verdadeiro se o ciclo e continuar, isto ´, quando se verificam as condi¸˜es das linhas e co 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 a ca Se o ciclo acabar (i1>i2), pela manuten¸˜o do invariante do ca ciclo, x n˜o est´ na lista. a a
  18. 18. Pesquisa bin´ria – termina¸˜o da fun¸˜o a ca ca Notas sobre a termina¸˜o da fun¸˜o: ca ca Os ´ ındices em que x pode “estar” s˜o i1, i1+1,. . . , i2. a Seja num=i2-i1+1 o n´mero desses ´ u ındices. A prova de termina¸˜o ´ baseada no facto de num diminuir de cada ca e vez que o teste das linhas 7 e 9 ´ efectuado e isso prova-se com os e seguintes factos i1 ≤ m ≤ i2 onde m resulta da atribui¸˜o m=(i1+i2)/2. ca A atribui¸˜o i2=m-1 (linha 8) reduz num, pois, com o valor ca inicial da i2, m − 1 < m ≤ i2 A atribui¸˜o i1=m+1 (linha 10) reduz num, pois, com o valor ca inicial da i1, i1 ≤ m < m + 1
  19. 19. Eficiˆncia da pesquisa bin´ria e a Vamos usar como medida de eficiˆncia no tempo de execu¸˜o e ca o n´mero c(n) de compara¸˜es entre x e a[i], contando as linhas u co 7 e 9 como uma s´ compara¸˜o, (compara¸˜o entre x e a[m]) o ca ca Vamos determinar o n´mero de compara¸˜es no pior caso (quando u co x n˜o est´ na lista) a a
  20. 20. Eficiˆncia da pesquisa bin´ria e a Para simplificar, supomos que n=len(a) ´ da forma n = 2p − 1. e Ap´s uma divis˜o a “meio”, o n´mero de ´ o a u ındices em que x pode estar passa de n = 2p − 1 a n = 2p−1 − 1. Por exemplo, 15 → 7 → 3 → 1 → 0
  21. 21. Eficiˆncia da pesquisa bin´ria e a Para simplificar, supomos que n=len(a) ´ da forma n = 2p − 1. e Ap´s uma divis˜o a “meio”, o n´mero de ´ o a u ındices em que x pode estar passa de n = 2p − 1 a n = 2p−1 − 1. Por exemplo, 15 → 7 → 3 → 1 → 0 0 0 . . . 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 • • • • • • • • • • • • • • •
  22. 22. Eficiˆncia da pesquisa bin´ria e a Para simplificar, supomos que n=len(a) ´ da forma n = 2p − 1. e Ap´s uma divis˜o a “meio”, o n´mero de ´ o a u ındices em que x pode estar passa de n = 2p − 1 a n = 2p−1 − 1. Por exemplo, 15 → 7 → 3 → 1 → 0 0 0 . . . 14 8 . . . 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
  23. 23. Eficiˆncia da pesquisa bin´ria e a Para simplificar, supomos que n=len(a) ´ da forma n = 2p − 1. e Ap´s uma divis˜o a “meio”, o n´mero de ´ o a u ındices em que x pode estar passa de n = 2p − 1 a n = 2p−1 − 1. Por exemplo, 15 → 7 → 3 → 1 → 0 0 0 . . . 14 8 . . . 14 8 . . . 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
  24. 24. Eficiˆncia da pesquisa bin´ria e a Para simplificar, supomos que n=len(a) ´ da forma n = 2p − 1. e Ap´s uma divis˜o a “meio”, o n´mero de ´ o a u ındices em que x pode estar passa de n = 2p − 1 a n = 2p−1 − 1. Por exemplo, 15 → 7 → 3 → 1 → 0 0 0 . . . 14 8 . . . 14 8 . . . 10 9...9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
  25. 25. Eficiˆncia da pesquisa bin´ria e a Para simplificar, supomos que n=len(a) ´ da forma n = 2p − 1. e Ap´s uma divis˜o a “meio”, o n´mero de ´ o a u ındices em que x pode estar passa de n = 2p − 1 a n = 2p−1 − 1. Por exemplo, 15 → 7 → 3 → 1 → 0 0 0 . . . 14 8 . . . 14 8 . . . 10 9...9 9...8 = ∅ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
  26. 26. Eficiˆncia da pesquisa bin´ria e a Para simplificar, supomos que n=len(a) ´ da forma n = 2p − 1. e Ap´s uma divis˜o a “meio”, o n´mero de ´ o a u ındices em que x pode estar passa de n = 2p − 1 a n = 2p−1 − 1. Por exemplo, 15 → 7 → 3 → 1 → 0 0 0 . . . 14 8 . . . 14 8 . . . 10 9...9 9...8 = ∅ 0 . . . 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • O n´mero de divis˜es a “meio”, que ´ igual ao n´mero de u o e u compara¸˜es, ´, neste caso, igual a 4 = log(n + 1). co e No caso geral, o n´mero de compara¸˜es n˜o excede log(n) + 1. u co a
  27. 27. Eficiˆncia da pesquisa bin´ria e a N´mero de compara¸˜es no pior caso. u co Exemplo para n = 108 , t = 1µseg (tempo associado a cada compara¸˜o) ca Pesquisa sequˆncial: c(n) = n, t = 100seg, quase 2 minutos. e Pesquisa bin´ria: c(n) ≈ log(n), t ≈ 27µseg! a Conclus˜o: a pesquisa bin´ria ´ muito mais r´pida que a pesquisa a a e a sequˆncial. e
  28. 28. fim

×