Escolar Documentos
Profissional Documentos
Cultura Documentos
Recorrências
é uma recorrência.
n Recorrência: uma equação que descreve uma
função em termos de seus valores para
instâncias menores
2
Exemplos de Recorrências
⎧ 0 n=0 ⎧ 0 n=0
s ( n) = ⎨ s ( n) = ⎨
⎩c + s(n − 1) n > 0 ⎩n + s(n − 1) n > 0
c n =1 ⎧
⎧ ⎪ c n =1
⎪⎪ ⎪
T ( n) = ⎨ T ( n) = ⎨
⎪2T ⎛⎜ n ⎞⎟ + c n > 1 ⎪ ⎛n⎞
⎪⎩ ⎝ 2 ⎠ ⎪aT ⎜ ⎟ + cn n > 1
⎩ ⎝b⎠
3
Solução de Recorrências
n Métodos
n Iteração
n Árvore de Recursão
n Mestre
n Aniquilador (solução de EDOs)
n Subsitituição
4
Método da Iteração
5
Método da Iteração
n Consiste em:
n Expandir a recorrência
n Usar proprieadades algebricas para encontrar
um somatório
n Resolver o somatório
6
Ex. 1 – Iteração
n Resolver
⎧ 0 n=0
s ( n) = ⎨
⎩c + s(n − 1) n > 0
7
Ex. 1 – Iteração (2)
n s(n) = c + s(n-1)
= c + c + s(n-2)
= 2c + s(n-2) ⎧ 0 n=0
s ( n) = ⎨
= 2c + c + s(n-3) ⎩c + s(n − 1) n > 0
= 3c + s(n-3)
…
= kc + s(n-k) = ck + s(n-k)
8
Ex. 1 – Iteração (3)
n Até agora para k < n temos
n s(n) = ck + s(n-k)
n E se k=n ?
n s(n) = cn + s(0) = cn
n Portanto
n S(n) = cn
⎧ 0 n=0
s ( n) = ⎨
⎩c + s(n − 1) n > 0
9
Ex. 2 – Iteração
n Resolver
⎧ 0 n=0
s ( n) = ⎨
⎩n + s(n − 1) n > 0
10
Ex. 2 – Iteração (2)
n s(n) ⎧ 0 n=0
s ( n) = ⎨
= n + s(n-1) ⎩n + s(n − 1) n > 0
= n + n-1 + s(n-2)
= n + n-1 + n-2 + s(n-3)
= n + n-1 + n-2 + n-3 + s(n-4)
=…
= n + n-1 + n-2 + n-3 + … + n-(k-1) + s(n-k)
n
= ∑i
i = n − k +1
+ s(n − k )
11
Ex. 2 – Iteração (3)
n Até agora para k<n temos
n
∑i
i = n − k +1
+ s(n − k )
n E se k=n ?
n n
n +1
∑ i + s(0) = ∑ i + 0 = n
i =1 i =1 2
n Portanto:
n +1
s ( n) = n
2
12
Ex. 3 – Iteração
n Resolver
⎧ c n =1
⎪ ⎛n⎞
T (n) = ⎨2T
⎜ ⎟ + c n >1
⎪⎩ ⎝ 2 ⎠
13
Ex. 3 – Iteração (2)
n T(n) = 2T(n/2) + c
= 2(2T(n/2/2) + c) + c
= 22T(n/22) + 2c + c
= 22(2T(n/22/2) + c) + 3c
= 23T(n/23) + 4c + 3c
= 23T(n/23) + 7c
= 23(2T(n/23/2) + c) + 7c
= 24T(n/24) + 15c
=…
= 2kT(n/2k) + (2k - 1)c ⎧ c n =1
⎪ ⎛n⎞
T (n) = ⎨2T
⎜ ⎟ + c n >1
⎪⎩ ⎝ 2 ⎠
14
Ex. 3 – Iteração (3)
n Até agora para 2k < n temos
n T(n) = 2kT(n/2k) + (2k - 1)c
n E se k=lg n?
n T(n) = 2lg n T(n/2lg n) + (2lg n - 1)c
= n T(n/n) + (n - 1)c
= n T(1) + (n-1)c
= nc + (n-1)c = (2n - 1)c
⎧ c n =1
⎪ ⎛n⎞
T (n) = ⎨2T
⎜ ⎟ + c n >1
⎪⎩ ⎝ 2 ⎠
15
Ex. 4 – Iteração
n Resolver
⎧ c n =1
⎪⎪
T ( n) = ⎨ n >1
⎛ n⎞
⎪aT ⎜ ⎟ + cn
⎪⎩ ⎝ b ⎠
16
Ex. 4 – Iteração (2)
n T(n) = c n =1
⎧
aT(n/b) + cn ⎪⎪
a(aT(n/b/b) + cn/b) + cn T ( n) = ⎨ n >1
⎛ n⎞
⎪aT ⎜ ⎟ + cn
a2T(n/b2) + cna/b + cn ⎪⎩ ⎝ b ⎠
a2T(n/b2) + cn(a/b + 1)
a2(aT(n/b2/b) + cn/b2) + cn(a/b + 1)
a3T(n/b3) + cn(a2/b2) + cn(a/b + 1)
a3T(n/b3) + cn(a2/b2 + a/b + 1)
…
akT(n/bk) + cn(ak-1/bk-1 + ak-2/bk-2 + … + a2/b2 + a/b + 1)
17
Ex. 4 – Iteração (3)
n Assim, temos
n T(n) = akT(n/bk) + cn(ak-1/bk-1 + ... + a2/b2 + a/b + 1)
n Para k = logb n
n n = bk
n T(n) = akT(1) + cn(ak-1/bk-1 + ... + a2/b2 + a/b + 1)
= akc + cn(ak-1/bk-1 + ... + a2/b2 + a/b + 1)
= cak + cn(ak-1/bk-1 + ... + a2/b2 + a/b + 1)
= cnak /bk + cn(ak-1/bk-1 + ... + a2/b2 + a/b + 1)
= cn(ak/bk + ... + a2/b2 + a/b + 1)
18
Ex. 4 – Iteração (4)
n E se a = b?
n T(n) = cn(k + 1)
= cn(logb n + 1)
= Θ(n log n)
19
Ex. 4 – Iteração (5)
n Lembrando que:
Σ(xk + xk-1 + … + x + 1) = (xk+1 -1)/(x-1)
n Temos:
a k a k −1
+ + ! +
a
+1 =
(a b )k +1 − 1 =
k +1
1 − (a b )
<
1
k k −1
b b b (a b ) − 1 1 − (a b ) 1− a b
n Então:
T(n) = cn ·Θ(1) = Θ(n)
20
Ex. 4 – Iteração (6)
a k a k −1 a
+ k −1 + ! + + 1 =
(a b )k +1 − 1 (
= Θ (a b )
k
)
k
b b b (a b ) − 1
n T(n) = cn · Θ(ak / bk)
= cn · Θ(alog n / blog n) = cn · Θ(alog n / n)
como, alog n = nlog a
= cn · Θ(nlog a / n) = Θ(cn · nlog a / n)
= Θ(nlog a )
21
Ex. 4 – Iteração (7)
n Portanto, finalmente …
⎧ Θ(n ) a<b
⎪
T (n) = ⎨Θ(n log b n ) a=b
( )
⎪ Θ n logb a
⎩ a>b
22
Exercícios
23
Determine a função de custo
n Faz-Algo(int n) {
n If(n > 0) {
n FOR(x=0; x< n; x++) {
n Faz-Algo(n-1);
n }
n }
n Else {
n Operação-unitária
n }
n }
24
Determine a função de custo
Faz-Algo(int n) {
If(n > 0) {
Faz-Algo(n-1);
FOR(x=0; x< n; x++) {
Operação-unitária
}
}
}
25
Determine a função de custo
Faz-Algo(int n) {
If(n > 1) {
Faz-Algo(n/3);
Faz-Algo(n/3);
FOR(x=0; x< n; x++) {
Operação-unitária
}
}
}
26
Árvores de Recursão
27
Árvores de Recursão
n Cada nodo representa o custo de um sub-
problema individual em algum ponto da
iteração das invocações recursivas
n Soma-se os custos em cada nível de
recursão
n O custo total é obtido somando-se os
custos de cada nível de recursão
28
Árvores de Recursão (2)
n Útil quando a recorrência é usada para
problemas de divisão e conquista
n Útil para produzir estimativas para serem
verificadas pelo método da substituição
n Pode-se ignorar os tetos e pisos e utilzar
coeficientes implícitos c > 0
29
Árvore de recursão:mergesort
30
Teorema Mestre
31
Teorema Mestre
n Considere um algoritmo que use divisão e
conquista
n Divide um problema de tamanho n em sub-
problemas, cada um de tamanho n/b
n Seja o f(n) custo de cada estágio, ou seja, o
custo de dividir os problemas e combinar as
soluções
n O método mestre consiste em uma receita de
bolo para encontrar a função de complexidade
do algoritmo
32
Teorema Mestre
n Usado para a solução de recorrências da forma
T (n) = aT (n / b) + f (n)
n a≥1, b>1, e f assintóticamente positiva;
n af(n/b)<= kf(n) (k menor que 1 e n grande)
n Sendo T(n) o tempo de execução do algoritmo,
podemos dizer que
n Sub-problemas de tamanho n/b são resolvidos
recursivamente cada um em tempo T (n/b)
n f (n) é o custo de dividir o problema e combinar seus
resultados. No Mergesort temos: T (n) = 2T (n / 2) + Θ(n)
33
Teorema Mestre (2)
T (n) = aT (n / b) + f (n)
36
Estratégia
n Identificar a, b e f (n)
logb a
n Determinar n
logb a
n Comparar f (n) e n assintóticamente
n De acordo com o caso, aplicar a regrar
correspondente
37
Exemplo
n T(n) = 9T(n/3) + n
n a=9, b=3, f(n) = n
n n logba = n log39 = Θ(n2)
n Com f(n) = O(nlog39 - ε), onde ε=1, o caso 1 se aplica:
( ) (
T (n) = Θ nlogb a quando f (n) = O nlogb a −ε )
n Portanto T(n) = Θ(n2)
38
Exemplo: Mergesort
T (n) = 2T (n / 2) + Θ(n)
T (n) = 2T (n / 2) + Θ(n)logb a
a = 2, b = 2; n = n log 2 2 = n = Θ(n)
a = 2, b = 2; n logb a = n log 2 2 = n = Θ(n)
Also f (n) = Θ(n)
ComoAlso f (n) = Θ(n)
T (Temos
n)⇒= Case
2T (on2caso
/: 2) ( n )
( )
⇒ Case 2: T (n) = Θ n logb a lg n = Θ ( n lg n )
T (+
n)Θ
2:
= Θ ( n log b a
)lg n = Θ ( n lg n )
a = 2, b = 2; n logb a = log
n logb a2 2 = n = Θ(n) logb a
f (n) = Θ(n ) T (n) = Θ(n lg n)
Also f (n) = Θ(n)
( )
⇒ Case 2: T (n) = Θ n logb a lg n = Θ ( n lg n )
39
Método aniquilador
n Para resolver equações na forma:
! 0 =0
! 1 =1 !
!>1:!! ! =! !−1 +! !−2
!
!
41
Passo 1: Encontrar Aniquilador
(!! −! −1) = 0!
! −!1 ! −!2 = 0!
!
43
Passo 2: Encontrar as raizes
da equação
!
!
−! ± !! − 4!"
!=
2!
!! − ! − 1
! !
−(−1) ± 1 − 4(−1)(1)
!=
21
! !
1± 5
!= 2
1+! 5
!1 = 2
!
1− 5
!2 =
2
! 44
Passo 3: Forma geral da eq
Raizes distintas:
! ! = !!!!! +!!!!!
Raizes iguais (DELTA = 0):
45
Passo 4:Usar casos base para
encontrar constantes
! ! = !!!!! +!!!!!
! !
! 1 = !!!! +!!!! = 1
! 0 = !!!!! +!!!!! = 0
1
!1 = !
5
1
!2 = − !
5
46
Passo 3: Forma geral da eq
! ! ! !
1 1+ 5 1 1− 5
!! =! −!
5 2 5 2
!
! ! = 0,447213595499958 1,618033988749895 −
!
0,447213595499958(−0,618033988749895)
47
! 0 =0
! 1 =1
!>1: ! ! =2! !−1 +3! !−2
48
(!! −2! −3) = 0
Raizes: 3 e -1
49
! !
! ! = !!!! +!!!!
! 1 = !!3! +!!(−1)! = 1
! 0 = !!3! +!!(−1)! = 0
!! +!! = 0
!! = −!!
1
!! = = 0,25
4
1
!! = − = 0,25
4
50
! ! = !!!!! +!!!!!
51
Método da Substituição
52
Conceitos básicos
n Dois passos
n Estimar a forma da solução
n Usar indução matemática para determinar se a
solução se aplica
n Útil quando é fácil estimar a forma da
solução
n Pode ser utilizado para estabelecer limites
superiores ou inferiores das recorrências
53
Exemplo – Substituição
n Resolver a recorrência
T (n) = 2T ( ⎣n / 2⎦) + n
T(n) = O(n lg n) ?
54
Exemplo – Substituição (2)
n Determinar um limite superior para
⎧⎪ 2T (⎢n / 2⎥) + n n > 1
⎣ ⎦
t(n) = ⎨
⎪⎩ 1 n =1
n Se T(n) = O(n lg n)
n Provar que T(n) ≤ cn lg n para algum c
usando indução e para todo n≥n0
55
Exemplo – Substituição (3)
n Base da indução: mostrar que a inequação
é válida para algum n suficientemente
pequeno
n Se n= 1 à T(1) ≤ c * 1 * log 1 = 0 !!!
n No entanto T(1) = 1
n Mas
n=3 à T(3)=2T(1) + 3 = 5 e cn lg n = c * 3 * lg 3
56
Exemplo – Substituição (4)
n Pode-se partir de T(2)=4 ou T(3)=5
usando qualquer c ≥ 2
n Válido de acordo com a notação
assintótica: T(n) ≤ cn lg n para n ≥ n0
n Truque: estender as condições de contorno
para fazer a hipótose indutiva valer para
pequenos valores de n
57
Exemplo – Substituição (5)
n Hipótese indutiva:
n Assumir a inequação para ⎣n / 2⎦
58
Exemplo – Substituição (5)
n Indução : A inequação é válida para n
T ( n) = 2T ( ⎣n / 2⎦) + n
≤ 2(c ⎣n / 2⎦ lg ⎣n / 2⎦)) + n
≤ cn lg(n / 2) + n
= cn (lg n − lg 2) + n T (⎣n / 2⎦) ≤ c ⎣n / 2⎦ lg⎣n / 2⎦)
≤ cn lg n − cn + n
≤ cn lg n (é valida para c ≥1)
59
Sobre Estimativas
n Requer experiência e criatividade
n Pode-se utilizar árvores de recursão
n Se a recursão é similar a uma outra com a
qual se está familiarizado, é razoável tentar
uma solução similar T (n) = 2T (⎣n / 2⎦ + 17) + n
n T(n) = O(n lg n) è Porque?
n O termo adicional (17) não afetará
substancialmente a solução da recorrência
para um n “grande”
60
Sobre Estimativas (2)
n As vezes a estimativa está correta mas as
contas “não fecham” na hora da indução
n A hipótese indutiva suficientemente forte !!
n Revisar a estimativa subtraindo um termo de
menor ordem assintótica
61
Sobre Estimativas (3)
T (n) ≤ c( ⎣n / 2⎦ − b) + c( ⎡n / 2⎤ − b) + 1 = cn − 2b + 1
T (n) ≤ cn − b
(para todo b ≥1)
62
Troca de Variáveis
m = lg n
T (n) = 2T ( n ) + lg n
m S(m)=T(2m)
m
T (2 ) = 2T (2 2 ) + m S(m)=O(m lg m)
S (m) = 2S (m / 2) + m
m
T ( n ) = T ( 2 ) = S ( m)
= O(m lg m) = O(lg n lg lg n)
63