1. Pesquisa sequencial e pesquisa bin´ria
a
Armando Matos
Departamento de Ciˆncia de Computadores
e
Universidade de Porto
2008
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]
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. 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. 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. 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. 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. 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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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