Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
2. Recorrências
Uma recorrência é uma expressão que dá o valor
de uma função em termos dos valores "anteriores"
da mesma função.
– p. 2/44
3. Recorrências
Uma recorrência é uma expressão que dá o valor
de uma função em termos dos valores "anteriores"
da mesma função.
Para analisar o consumo de tempo de um
algoritmo recursivo é necessário resolver uma
recorrência.
– p. 2/44
4. Recorrências
O exemplo clássico de recorrência, provavelmente
o mais famoso, é a fórmula de Fibonacci:
F(n) =
0 se n = 0
1 se n = 1
F(n − 1) + F(n − 2) se n ≥ 2
– p. 3/44
5. Recorrências
O exemplo clássico de recorrência, provavelmente
o mais famoso, é a fórmula de Fibonacci:
F(n) =
0 se n = 0
1 se n = 1
F(n − 1) + F(n − 2) se n ≥ 2
Uma “fórmula fechada” para F(n) é dada por:
F(n) =
1
√
5
1 +
√
5
2
n
−
1
√
5
1 −
√
5
2
n
– p. 3/44
9. Recorrências - busca binária
Vamos analisar novamente o consumo de tempo
do algoritmo da busca binária.
– p. 6/44
10. Recorrências - busca binária
Vamos analisar novamente o consumo de tempo
do algoritmo da busca binária. Em cada iteração,
o algoritmo descarta metade do vetor.
– p. 6/44
11. Recorrências - busca binária
Vamos analisar novamente o consumo de tempo
do algoritmo da busca binária. Em cada iteração,
o algoritmo descarta metade do vetor. Se
denotamos por T(n) o número máximo de
iterações realizadas pela busca binária sobre um
vetor com n elementos,
– p. 6/44
12. Recorrências - busca binária
Vamos analisar novamente o consumo de tempo
do algoritmo da busca binária. Em cada iteração,
o algoritmo descarta metade do vetor. Se
denotamos por T(n) o número máximo de
iterações realizadas pela busca binária sobre um
vetor com n elementos, a função T(n) pode ser
expressa pela seguinte recorrência:
T(n) = T(
n
2
) + 1, T(1) = 1
– p. 6/44
13. Recorrências - busca binária
Para obter uma solução, supomos inicialmente que
n = 2k
.
– p. 7/44
14. Recorrências - busca binária
Para obter uma solução, supomos inicialmente que
n = 2k
.
T(n) = T
n
2
+ 1
= T
n
22
+ 1 + 1 = T
n
22
+ 2
= T
n
23
+ 1 + 2 = T
n
23
+ 3
= · · ·
= T
n
2k
+ k = k + 1 = log n + 1
– p. 7/44
15. Recorrências - busca binária
Podemos agora tentar mostrar que
T(n) ≤ log n + 1, ∀n ≥ 1, por indução em n.
– p. 8/44
16. Recorrências - busca binária
Podemos agora tentar mostrar que
T(n) ≤ log n + 1, ∀n ≥ 1, por indução em n.
Para n = 1, T(1) = 1 = log 1 + 1
– p. 8/44
17. Recorrências - busca binária
Podemos agora tentar mostrar que
T(n) ≤ log n + 1, ∀n ≥ 1, por indução em n.
Para n = 1, T(1) = 1 = log 1 + 1
Para n > 1, temos
– p. 8/44
18. Recorrências - busca binária
Podemos agora tentar mostrar que
T(n) ≤ log n + 1, ∀n ≥ 1, por indução em n.
Para n = 1, T(1) = 1 = log 1 + 1
Para n > 1, temos
T(n) = T(
n
2
) + 1
≤ (log(
n
2
) + 1) + 1
≤ log
n
2
+ 2 = (log n − 1) + 2
= log n + 1
– p. 8/44
20. Recorrências - Exemplo
Consideremos a recorrência
T(n) = 2T(
n
2
) + n − 1, T(1) = 1
Podemos conjecturar que T(n) ≤ n2
e tentar provar
por indução em n.
– p. 9/44
21. Recorrências - Exemplo
Consideremos a recorrência
T(n) = 2T(
n
2
) + n − 1, T(1) = 1
Podemos conjecturar que T(n) ≤ n2
e tentar provar
por indução em n.
T(1) = 1 ≤ 12
– p. 9/44
22. Recorrências - Exemplo
Consideremos a recorrência
T(n) = 2T(
n
2
) + n − 1, T(1) = 1
Podemos conjecturar que T(n) ≤ n2
e tentar provar
por indução em n.
T(1) = 1 ≤ 12
T(2) = 2T(1) + 1 = 3 < 22
– p. 9/44
26. Recorrências - Exemplo
Será n2
uma boa estimativa para T(n)?
Será que conseguimos provar que T(n) ≤ cn, para
alguma constante c > 0 e n ≥ n0?
– p. 11/44
27. Recorrências - Exemplo
Será n2
uma boa estimativa para T(n)?
Será que conseguimos provar que T(n) ≤ cn, para
alguma constante c > 0 e n ≥ n0? Vamos tentar.
– p. 11/44
28. Recorrências - Exemplo
T(n) = 2T(
n
2
) + n − 1
≤ 2c
n
2
+ n − 1
≤ 2c
n
2
+ n − 1
≤ cn + n − 1 cn
Para qualquer c > 0.
– p. 12/44
29. Recorrências - Exemplo
T(n) = 2T(
n
2
) + n − 1
≤ 2c
n
2
+ n − 1
≤ 2c
n
2
+ n − 1
≤ cn + n − 1 cn
Para qualquer c > 0. Logo,
T(n) cn
– p. 12/44
32. Recorrências - Exemplo
E que tal T(n) ≤ n log2 n + 1?
T(1) = 1 = 1 log 1 + 1
T(2) = 2T(1) + 1 = 3 = 2 log 2 + 1
– p. 13/44
33. Recorrências - Exemplo
E que tal T(n) ≤ n log2 n + 1?
T(1) = 1 = 1 log 1 + 1
T(2) = 2T(1) + 1 = 3 = 2 log 2 + 1
Vamos então tentar mostrar que
T(n) ≤ n log2 n + 1
para n ≥ 1.
– p. 13/44
34. Recorrências - Exemplo
T(n) = 2T(
n
2
) + n − 1
≤ 2(
n
2
log
n
2
+ 1) + n − 1
≤ 2(
n
2
log
n
2
+ 1) + n − 1
= n(log n − 1) + n + 1 = n log n + 1
– p. 14/44
35. Recorrências - Exemplo
T(n) = 2T(
n
2
) + n − 1
≤ 2(
n
2
log
n
2
+ 1) + n − 1
≤ 2(
n
2
log
n
2
+ 1) + n − 1
= n(log n − 1) + n + 1 = n log n + 1
Portanto,
T(n) ≤ n log n + 1
para n ≥ 1.
– p. 14/44
36. Recorrências
Os exemplos anteriores mostram que a solução de
uma recorrência pode ser obtida:
1. Desenvolvendo (ou “desenrolando”) a
recorrência.
2. Estimando a solução e provando o resultado
por indução.
Estas duas formas conjuntas recebem o nome de
método da substituição.
– p. 15/44
38. Recorrências - Exemplo
Consideremos a recorrência
T(n) = T(
n
2
) + T(
n
2
) + 1, T(1) = 1
Podemos conjecturar que T(n) ≤ cn e tentar provar
por indução em n.
– p. 16/44
39. Recorrências - Exemplo
Consideremos a recorrência
T(n) = T(
n
2
) + T(
n
2
) + 1, T(1) = 1
Podemos conjecturar que T(n) ≤ cn e tentar provar
por indução em n. É comum partimos logo para
analisar o caso geral, pois a base geralmente pode
ser acertada.
– p. 16/44
40. Recorrências - Exemplo
T(n) = T(
n
2
) + T(
n
2
) + 1
≤ c
n
2
+ c
n
2
+ 1
= cn + 1
O que não implica que T(n) ≤ cn.
– p. 17/44
41. Recorrências - Exemplo
T(n) = T(
n
2
) + T(
n
2
) + 1
≤ c
n
2
+ c
n
2
+ 1
= cn + 1
O que não implica que T(n) ≤ cn.
Importante: precisamos provar a forma exata da
hipótese indutiva.
– p. 17/44
42. Recorrências - Exemplo
Uma forma de contornar este problema é subtrair
um termo de ordem menor. Por exemplo, tomemos
agora T(n) ≤ cn − 1.
– p. 18/44
43. Recorrências - Exemplo
Uma forma de contornar este problema é subtrair
um termo de ordem menor. Por exemplo, tomemos
agora T(n) ≤ cn − 1.
T(n) = T(
n
2
) + T(
n
2
) + 1
≤ (c
n
2
− 1) + (c
n
2
− 1) + 1
≤ cn − 1
para qualquer c positivo.
– p. 18/44
44. Recorrências - Exemplo
Uma forma de contornar este problema é subtrair
um termo de ordem menor. Por exemplo, tomemos
agora T(n) ≤ cn − 1.
T(n) = T(
n
2
) + T(
n
2
) + 1
≤ (c
n
2
− 1) + (c
n
2
− 1) + 1
≤ cn − 1
para qualquer c positivo. Tomando c = 2, temos
T(1) = 1 ≤ 2(1) − 1. Logo, T(n) ≤ 2n − 1.
– p. 18/44
45. Recorrências - Exercícios
1. Resolva a recorrência T(n) = T( n
2 ) + 7n + 2,
T(1) = 1.
2. Mostre que a solução de T(n) = T(n − 1) + n é O(n2).
3. Mostre que a solução de T(n) = T( n
2 ) + 1 é O(log n).
4. Mostre que a solução de T(n) = 2T( n
2 + 17) + n é
O(n log n).
5. Resolva a recorrência T(n) = 3T( n
2 ) + n, T(1) = 1.
6. Resolva a recorrência T(n) = 3T( n
3 ) + 1, T(1) = 1.
7. Mostre que a solução de T(n) = 3T n
2 + n é O(nlog2 3).
8. Mostre que a solução de T(n) = 4T n
2 + n é O(n2).
– p. 19/44
48. Identidades úteis
Apresentamos a seguir algumas igualdades e
desigualdades que são úteis na análise algoritmos.
S´erie aritm´etica: Se ai = ai−1 + c, onde c é uma
constante, então
a1 + a2 + a3 + · · · + an =
n(an + a1)
2
– p. 21/44
49. Série geométrica
Se ai = cai−1, onde c = 1 é uma constante, então
a1 + a2 + a3 + · · · + an =
a1(cn − 1)
c − 1
Se 0 < c < 1, então
∞
i=1
ai =
a1
1 − c
– p. 22/44
54. Árvore de recursão
Árvore de recursão é um método muito útil para
estimar a solução de uma recorrência. Uma vez
obtida a solução, utilizamos o método anterior para
prová-la formalmente.
A idéia da árvore de recursão é tentar representar
o desenvolvimento da recorrência por um diagrama
(geralmente uma árvore) onde cada nó representa
um subproblema, e somar os custos por nível.
– p. 27/44
58. Exercícios
Use árvore de recursão para determinar um limite superior
para as recorrências abaixo, e depois prove o resultado
usando indução ou substituição.
1. T(n) = T(n/4) + T(n/2) + n2
2. T(n) = 3T n
4 + n
3. T(n) = 4T n
2 + 2 + n
4. T(n) = T(n − a) + T(a) + cn
– p. 31/44
60. Método mestre
O método mestre fornece uma receita para a
solução de recorrências da forma
T(n) = aT(n/b) + f(n)
onde a ≥ 1 e b > 1 são constantes e f(n) é uma
função assintóticamente positiva.
– p. 33/44
61. Método mestre
Considere a recorrência
T(n) = aT(n/b) + f(n)
onde a ≥ 1 e b > 1 são constantes, f(n) é uma
função assintóticamente positiva, e n/b pode ser
n/b ou n/b . Então
1. Se f(n) = O(nlogb a−
) para alguma constante
> 0 então T(n) = Θ(nlogb a
)
– p. 34/44
62. Método mestre
Considere a recorrência
T(n) = aT(n/b) + f(n)
onde a ≥ 1 e b > 1 são constantes, f(n) é uma
função assintóticamente positiva, e n/b pode ser
n/b ou n/b . Então
1. Se f(n) = O(nlogb a−
) para alguma constante
> 0 então T(n) = Θ(nlogb a
)
2. Se f(n) = Θ(nlogb a
) então T(n) = Θ(nlogb a
log n)
– p. 34/44
63. Método mestre
3. Se f(n) = Ω(nlogb a+
) para alguma constante
> 0, e se af(n/b) ≤ cf(n) para alguma
constante c < 1 e n suficientemente grande,
então T(n) = Θ(f(n))
– p. 35/44
64. Método mestre
T(n) = aT(n/b) + f(n)
T(n) Se
Θ(nlogb a
) f(n) = O(nlogb a−
)
Θ(nlogb a
log n) f(n) = Θ(nlogb a
)
Θ(f(n)) f(n) = Ω(nlogb a+
)
e af(n/b) ≤ cf(n), c < 1
– p. 36/44
66. Método mestre - Exemplo 1
T(n) = 9T(n/3) + n
a = 9, b = 3 e f(n) = n
– p. 37/44
67. Método mestre - Exemplo 1
T(n) = 9T(n/3) + n
a = 9, b = 3 e f(n) = n
nlogb a
= nlog3 9
= n2
– p. 37/44
68. Método mestre - Exemplo 1
T(n) = 9T(n/3) + n
a = 9, b = 3 e f(n) = n
nlogb a
= nlog3 9
= n2
Logo, f(n) = O(nlogb a−
), onde = 1
– p. 37/44
69. Método mestre - Exemplo 1
T(n) = 9T(n/3) + n
a = 9, b = 3 e f(n) = n
nlogb a
= nlog3 9
= n2
Logo, f(n) = O(nlogb a−
), onde = 1
Pelo Caso 1, T(n) = Θ(n2
).
– p. 37/44
71. Método mestre - Exemplo 2
T(n) = T(2n/3) + 1
a = 1, b = 3/2 e f(n) = 1
– p. 38/44
72. Método mestre - Exemplo 2
T(n) = T(2n/3) + 1
a = 1, b = 3/2 e f(n) = 1
nlogb a
= nlog3/2 1
= n0
= 1
– p. 38/44
73. Método mestre - Exemplo 2
T(n) = T(2n/3) + 1
a = 1, b = 3/2 e f(n) = 1
nlogb a
= nlog3/2 1
= n0
= 1
Logo, f(n) = 1 = Θ(nlogb a
)
– p. 38/44
74. Método mestre - Exemplo 2
T(n) = T(2n/3) + 1
a = 1, b = 3/2 e f(n) = 1
nlogb a
= nlog3/2 1
= n0
= 1
Logo, f(n) = 1 = Θ(nlogb a
)
Pelo Caso 2, T(n) = Θ(log n).
– p. 38/44
75. Método mestre - Exemplo 3
T(n) = 3T(n/4) + n log n
– p. 39/44
76. Método mestre - Exemplo 3
T(n) = 3T(n/4) + n log n
a = 3, b = 4 e f(n) = n log n
– p. 39/44
77. Método mestre - Exemplo 3
T(n) = 3T(n/4) + n log n
a = 3, b = 4 e f(n) = n log n
nlogb a
= nlog4 3
– p. 39/44
78. Método mestre - Exemplo 3
T(n) = 3T(n/4) + n log n
a = 3, b = 4 e f(n) = n log n
nlogb a
= nlog4 3
Logo, f(n) = n log n = Ω(nlog4 3+
)
– p. 39/44
79. Método mestre - Exemplo 3
T(n) = 3T(n/4) + n log n
a = 3, b = 4 e f(n) = n log n
nlogb a
= nlog4 3
Logo, f(n) = n log n = Ω(nlog4 3+
)
af(n/b) = 3(n/4) log(n/4) ≤ (3/4)n log n
– p. 39/44
80. Método mestre - Exemplo 3
T(n) = 3T(n/4) + n log n
a = 3, b = 4 e f(n) = n log n
nlogb a
= nlog4 3
Logo, f(n) = n log n = Ω(nlog4 3+
)
af(n/b) = 3(n/4) log(n/4) ≤ (3/4)n log n
Pelo Caso 3, T(n) = Θ(n log n).
– p. 39/44
81. Método mestre - Exemplo 4
T(n) = 2T(n/2) + n log n
– p. 40/44
82. Método mestre - Exemplo 4
T(n) = 2T(n/2) + n log n
a = 2, b = 2 e f(n) = n log n
– p. 40/44
83. Método mestre - Exemplo 4
T(n) = 2T(n/2) + n log n
a = 2, b = 2 e f(n) = n log n
nlogb a
= nlog2 2
= n
– p. 40/44
84. Método mestre - Exemplo 4
T(n) = 2T(n/2) + n log n
a = 2, b = 2 e f(n) = n log n
nlogb a
= nlog2 2
= n
Caso 3
– p. 40/44
85. Método mestre - Exemplo 4
T(n) = 2T(n/2) + n log n
a = 2, b = 2 e f(n) = n log n
nlogb a
= nlog2 2
= n
Caso 3
Mas, f(n) = n log n = Ω(nlog2 2+
)
– p. 40/44
86. Método mestre - Exemplo 4
T(n) = 2T(n/2) + n log n
a = 2, b = 2 e f(n) = n log n
nlogb a
= nlog2 2
= n
Caso 3
Mas, f(n) = n log n = Ω(nlog2 2+
)
Portanto, o método mestre não se aplica.
– p. 40/44