An´alise de Algoritmos
Solução de recorrências
– p. 1/44
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
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
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
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
Recorrências
Um outro exemplo clássico de recorrência é:
F(n) =



1 se n = 0
n.F(n − 1) se n ≥ 1
– p. 4/44
Recorrências
Um outro exemplo clássico de recorrência é:
F(n) =



1 se n = 0
n.F(n − 1) se n ≥ 1
Uma fórmula fechada para F(n) é dada por:
F(n) = n.F(n − 1)
= n.(n − 1).F(n − 2) = · · · =
= n.(n − 1).(n − 2) . . . 2.1.1
= n!
– p. 4/44
Recorrências
Resolver uma recorrência é encontrar uma
“fórmula fechada” que dê o valor da função
diretamente em termos do seu argumento.
– p. 5/44
Recorrências - busca binária
Vamos analisar novamente o consumo de tempo
do algoritmo da busca binária.
– p. 6/44
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
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
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
Recorrências - busca binária
Para obter uma solução, supomos inicialmente que
n = 2k
.
– p. 7/44
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
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
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
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
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
Recorrências - Exemplo
Consideremos a recorrência
T(n) = 2T(
n
2
) + n − 1, T(1) = 1
– p. 9/44
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
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
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
Recorrências - Exemplo
Para n ≥ 3, temos
– p. 10/44
Recorrências - Exemplo
Para n ≥ 3, temos
T(n) = 2T(
n
2
) + n − 1
≤ 2
n
2
2
+ n − 1
≤ 2
n
2
2
+ n − 1
≤
n2
2
+ n − 1
≤
n2
2
+
n2
2
= n2
, ∀n > 0
– p. 10/44
Recorrências - Exemplo
Será n2
uma boa estimativa para T(n)?
– p. 11/44
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
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
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
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
Recorrências - Exemplo
E que tal T(n) ≤ n log2 n + 1?
– p. 13/44
Recorrências - Exemplo
E que tal T(n) ≤ n log2 n + 1?
T(1) = 1 = 1 log 1 + 1
– p. 13/44
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
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
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
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
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
Recorrências - Exemplo
Consideremos a recorrência
T(n) = T(
n
2
) + T(
n
2
) + 1, T(1) = 1
– p. 16/44
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
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
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
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
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
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
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
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
An´alise de Algoritmos
Identidades úteis
– p. 20/44
Identidades úteis
Apresentamos a seguir algumas igualdades e
desigualdades que são úteis na análise algoritmos.
– p. 21/44
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
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
Soma de quadrados
n
i=1
i2
=
n(n + 1)(2n + 1)
6
– p. 23/44
Logaritmos
logb a =
logc a
logc b
aloga x
= x
– p. 24/44
Aproximação de Stirling
n! =
√
2πn
n
e
n
(1 + O(
1
n
))
Em particular, a aproximação de Stirling implica
que
log(n!) = Θ(n log n)
– p. 25/44
An´alise de Algoritmos
Árvore de recursão
– p. 26/44
Á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
Exemplo 1
Consideremos a recorrência T(n) = 2T n
2 + n
– p. 28/44
Exemplo 2
T(n) = T n
3 + T 2n
3 + n
– p. 29/44
Exemplo 3
T(n) = 3T n
2 + n2
– p. 30/44
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
An´alise de Algoritmos
Método mestre
– p. 32/44
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
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
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
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
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
Método mestre - Exemplo 1
T(n) = 9T(n/3) + n
– p. 37/44
Método mestre - Exemplo 1
T(n) = 9T(n/3) + n
a = 9, b = 3 e f(n) = n
– p. 37/44
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
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
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
Método mestre - Exemplo 2
T(n) = T(2n/3) + 1
– p. 38/44
Método mestre - Exemplo 2
T(n) = T(2n/3) + 1
a = 1, b = 3/2 e f(n) = 1
– p. 38/44
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
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
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
Método mestre - Exemplo 3
T(n) = 3T(n/4) + n log n
– p. 39/44
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
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
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
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
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
Método mestre - Exemplo 4
T(n) = 2T(n/2) + n log n
– p. 40/44
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
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
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
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
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
Método mestre - Exemplo 5
T(n) = 2T(n/2) + cn
– p. 41/44
Método mestre - Exemplo 5
T(n) = 2T(n/2) + cn
a = 2, b = 2 e f(n) = cn
– p. 41/44
Método mestre - Exemplo 5
T(n) = 2T(n/2) + cn
a = 2, b = 2 e f(n) = cn
nlogb a
= nlog2 2
= n
– p. 41/44
Método mestre - Exemplo 5
T(n) = 2T(n/2) + cn
a = 2, b = 2 e f(n) = cn
nlogb a
= nlog2 2
= n
Logo, f(n) = cn = Θ(n) = Θ(nlogb a
)
– p. 41/44
Método mestre - Exemplo 5
T(n) = 2T(n/2) + cn
a = 2, b = 2 e f(n) = cn
nlogb a
= nlog2 2
= n
Logo, f(n) = cn = Θ(n) = Θ(nlogb a
)
Pelo Caso 2, T(n) = Θ(n log n).
– p. 41/44
Método mestre - Exemplo 6
T(n) = 8T(n/2) + cn2
– p. 42/44
Método mestre - Exemplo 6
T(n) = 8T(n/2) + cn2
a = 8, b = 2 e f(n) = cn2
– p. 42/44
Método mestre - Exemplo 6
T(n) = 8T(n/2) + cn2
a = 8, b = 2 e f(n) = cn2
nlogb a
= nlog2 8
= n3
– p. 42/44
Método mestre - Exemplo 6
T(n) = 8T(n/2) + cn2
a = 8, b = 2 e f(n) = cn2
nlogb a
= nlog2 8
= n3
Logo, f(n) = cn2
= O(nlogb a−
), onde = 1
– p. 42/44
Método mestre - Exemplo 6
T(n) = 8T(n/2) + cn2
a = 8, b = 2 e f(n) = cn2
nlogb a
= nlog2 8
= n3
Logo, f(n) = cn2
= O(nlogb a−
), onde = 1
Pelo Caso 1, T(n) = Θ(n3
).
– p. 42/44
Método mestre - Exemplo 7
T(n) = 7T(n/2) + cn2
– p. 43/44
Método mestre - Exemplo 7
T(n) = 7T(n/2) + cn2
a = 7, b = 2 e f(n) = cn2
– p. 43/44
Método mestre - Exemplo 7
T(n) = 7T(n/2) + cn2
a = 7, b = 2 e f(n) = cn2
nlogb a
= nlog2 7
– p. 43/44
Método mestre - Exemplo 7
T(n) = 7T(n/2) + cn2
a = 7, b = 2 e f(n) = cn2
nlogb a
= nlog2 7
Logo, f(n) = cn2
= O(nlogb a−
), onde > 0
– p. 43/44
Método mestre - Exemplo 7
T(n) = 7T(n/2) + cn2
a = 7, b = 2 e f(n) = cn2
nlogb a
= nlog2 7
Logo, f(n) = cn2
= O(nlogb a−
), onde > 0
Pelo Caso 1, T(n) = Θ(nlog2 7
).
– p. 43/44
Método mestre - Exercícios
1. T(n) = 2T(n/4) + 1
2. T(n) = 2T(n/4) +
√
n
3. T(n) = 2T(n/4) + n
4. T(n) = 2T(n/4) + n2
5. T(n) = T(n/2) + 1
6. T(n) = 4T(n/2) + n
7. T(n) = 4T(n/2) + n2
8. T(n) = 4T(n/2) + n3
– p. 44/44

Análise de Algoritmos - Solução de Recorrências

  • 1.
    An´alise de Algoritmos Soluçãode recorrências – p. 1/44
  • 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ássicode 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ássicode 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
  • 6.
    Recorrências Um outro exemploclássico de recorrência é: F(n) =    1 se n = 0 n.F(n − 1) se n ≥ 1 – p. 4/44
  • 7.
    Recorrências Um outro exemploclássico de recorrência é: F(n) =    1 se n = 0 n.F(n − 1) se n ≥ 1 Uma fórmula fechada para F(n) é dada por: F(n) = n.F(n − 1) = n.(n − 1).F(n − 2) = · · · = = n.(n − 1).(n − 2) . . . 2.1.1 = n! – p. 4/44
  • 8.
    Recorrências Resolver uma recorrênciaé encontrar uma “fórmula fechada” que dê o valor da função diretamente em termos do seu argumento. – p. 5/44
  • 9.
    Recorrências - buscabinária Vamos analisar novamente o consumo de tempo do algoritmo da busca binária. – p. 6/44
  • 10.
    Recorrências - buscabiná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 - buscabiná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 - buscabiná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 - buscabinária Para obter uma solução, supomos inicialmente que n = 2k . – p. 7/44
  • 14.
    Recorrências - buscabiná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 - buscabinária Podemos agora tentar mostrar que T(n) ≤ log n + 1, ∀n ≥ 1, por indução em n. – p. 8/44
  • 16.
    Recorrências - buscabiná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 - buscabiná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 - buscabiná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
  • 19.
    Recorrências - Exemplo Consideremosa recorrência T(n) = 2T( n 2 ) + n − 1, T(1) = 1 – p. 9/44
  • 20.
    Recorrências - Exemplo Consideremosa 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 Consideremosa 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 Consideremosa 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
  • 23.
    Recorrências - Exemplo Paran ≥ 3, temos – p. 10/44
  • 24.
    Recorrências - Exemplo Paran ≥ 3, temos T(n) = 2T( n 2 ) + n − 1 ≤ 2 n 2 2 + n − 1 ≤ 2 n 2 2 + n − 1 ≤ n2 2 + n − 1 ≤ n2 2 + n2 2 = n2 , ∀n > 0 – p. 10/44
  • 25.
    Recorrências - Exemplo Serán2 uma boa estimativa para T(n)? – p. 11/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
  • 30.
    Recorrências - Exemplo Eque tal T(n) ≤ n log2 n + 1? – p. 13/44
  • 31.
    Recorrências - Exemplo Eque tal T(n) ≤ n log2 n + 1? T(1) = 1 = 1 log 1 + 1 – p. 13/44
  • 32.
    Recorrências - Exemplo Eque 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 Eque 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 anterioresmostram 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
  • 37.
    Recorrências - Exemplo Consideremosa recorrência T(n) = T( n 2 ) + T( n 2 ) + 1, T(1) = 1 – p. 16/44
  • 38.
    Recorrências - Exemplo Consideremosa 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 Consideremosa 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 Umaforma 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 Umaforma 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 Umaforma 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
  • 46.
  • 47.
    Identidades úteis Apresentamos aseguir algumas igualdades e desigualdades que são úteis na análise algoritmos. – p. 21/44
  • 48.
    Identidades úteis Apresentamos aseguir 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
  • 50.
    Soma de quadrados n i=1 i2 = n(n+ 1)(2n + 1) 6 – p. 23/44
  • 51.
    Logaritmos logb a = logca logc b aloga x = x – p. 24/44
  • 52.
    Aproximação de Stirling n!= √ 2πn n e n (1 + O( 1 n )) Em particular, a aproximação de Stirling implica que log(n!) = Θ(n log n) – p. 25/44
  • 53.
    An´alise de Algoritmos Árvorede recursão – p. 26/44
  • 54.
    Árvore de recursão Árvorede 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
  • 55.
    Exemplo 1 Consideremos arecorrência T(n) = 2T n 2 + n – p. 28/44
  • 56.
    Exemplo 2 T(n) =T n 3 + T 2n 3 + n – p. 29/44
  • 57.
    Exemplo 3 T(n) =3T n 2 + n2 – p. 30/44
  • 58.
    Exercícios Use árvore derecursã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
  • 59.
  • 60.
    Método mestre O métodomestre 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 arecorrê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 arecorrê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. Sef(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
  • 65.
    Método mestre -Exemplo 1 T(n) = 9T(n/3) + n – p. 37/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
  • 70.
    Método mestre -Exemplo 2 T(n) = T(2n/3) + 1 – p. 38/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
  • 87.
    Método mestre -Exemplo 5 T(n) = 2T(n/2) + cn – p. 41/44
  • 88.
    Método mestre -Exemplo 5 T(n) = 2T(n/2) + cn a = 2, b = 2 e f(n) = cn – p. 41/44
  • 89.
    Método mestre -Exemplo 5 T(n) = 2T(n/2) + cn a = 2, b = 2 e f(n) = cn nlogb a = nlog2 2 = n – p. 41/44
  • 90.
    Método mestre -Exemplo 5 T(n) = 2T(n/2) + cn a = 2, b = 2 e f(n) = cn nlogb a = nlog2 2 = n Logo, f(n) = cn = Θ(n) = Θ(nlogb a ) – p. 41/44
  • 91.
    Método mestre -Exemplo 5 T(n) = 2T(n/2) + cn a = 2, b = 2 e f(n) = cn nlogb a = nlog2 2 = n Logo, f(n) = cn = Θ(n) = Θ(nlogb a ) Pelo Caso 2, T(n) = Θ(n log n). – p. 41/44
  • 92.
    Método mestre -Exemplo 6 T(n) = 8T(n/2) + cn2 – p. 42/44
  • 93.
    Método mestre -Exemplo 6 T(n) = 8T(n/2) + cn2 a = 8, b = 2 e f(n) = cn2 – p. 42/44
  • 94.
    Método mestre -Exemplo 6 T(n) = 8T(n/2) + cn2 a = 8, b = 2 e f(n) = cn2 nlogb a = nlog2 8 = n3 – p. 42/44
  • 95.
    Método mestre -Exemplo 6 T(n) = 8T(n/2) + cn2 a = 8, b = 2 e f(n) = cn2 nlogb a = nlog2 8 = n3 Logo, f(n) = cn2 = O(nlogb a− ), onde = 1 – p. 42/44
  • 96.
    Método mestre -Exemplo 6 T(n) = 8T(n/2) + cn2 a = 8, b = 2 e f(n) = cn2 nlogb a = nlog2 8 = n3 Logo, f(n) = cn2 = O(nlogb a− ), onde = 1 Pelo Caso 1, T(n) = Θ(n3 ). – p. 42/44
  • 97.
    Método mestre -Exemplo 7 T(n) = 7T(n/2) + cn2 – p. 43/44
  • 98.
    Método mestre -Exemplo 7 T(n) = 7T(n/2) + cn2 a = 7, b = 2 e f(n) = cn2 – p. 43/44
  • 99.
    Método mestre -Exemplo 7 T(n) = 7T(n/2) + cn2 a = 7, b = 2 e f(n) = cn2 nlogb a = nlog2 7 – p. 43/44
  • 100.
    Método mestre -Exemplo 7 T(n) = 7T(n/2) + cn2 a = 7, b = 2 e f(n) = cn2 nlogb a = nlog2 7 Logo, f(n) = cn2 = O(nlogb a− ), onde > 0 – p. 43/44
  • 101.
    Método mestre -Exemplo 7 T(n) = 7T(n/2) + cn2 a = 7, b = 2 e f(n) = cn2 nlogb a = nlog2 7 Logo, f(n) = cn2 = O(nlogb a− ), onde > 0 Pelo Caso 1, T(n) = Θ(nlog2 7 ). – p. 43/44
  • 102.
    Método mestre -Exercícios 1. T(n) = 2T(n/4) + 1 2. T(n) = 2T(n/4) + √ n 3. T(n) = 2T(n/4) + n 4. T(n) = 2T(n/4) + n2 5. T(n) = T(n/2) + 1 6. T(n) = 4T(n/2) + n 7. T(n) = 4T(n/2) + n2 8. T(n) = 4T(n/2) + n3 – p. 44/44