Você está na página 1de 63

Projeto e Análise de Algoritmos

Recorrências

Universidade Federal do Amazonas


Instituto de Computação
Recorrências
n A expressão:
⎧ c n =1
⎪⎪
T ( n) = ⎨
⎪2T ⎛⎜ n ⎞⎟ + cn n > 1
⎪⎩ ⎝ 2 ⎠

é 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 Então, para k = logb n


n T(n) = cn(ak/bk + ... + a2/b2 + a/b + 1)

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 E se a < b? T(n) = cn(ak/bk + ... + a2/b2 + a/b + 1)

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)

n E se a > b? T(n) = cn(ak/bk + ... + a2/b2 + a/b + 1)

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)

• Os sub problemas são divididos em a partes.


• Existirão logbn níveis
• Ocorrerão alogb n = nlogb a folhas
34
Teorema Mestre (5)
n Três casos comuns:
n Tempo de execução é dominado pelo custo nas folhas
n Tempo de execução é uniformemente distribuído pela
árvore
n Tempo de execução é dominado pelo custo na raiz
n Assim, para resolver a recorrência, teremos de
caracterizar o termo dominante
n Para cada caso comparar
logb a
f ( n) O( n )
35
Resumo do Teorema Mestre
n Seja uma recorrência da forma

T (n) = aT (n / b) + f (n)

1. f (n) = O(n logb a −ε ), ε > 0 ⇒ T (n) = Θ(n logb a )


2. f (n) = Θ(n logb a ) ⇒ T (n) = Θ(n logb a lg n)
3. f (n) = Ω(n logb a +ε ), ε > 0 ⇒ T (n) = Θ( f (n))
sendo a. f (n / b) ≤ c. f (n), c < 1

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:

n Se α(n)=0, t(n) é homogênea


n Grau d de t(n) é dado pelo maior an-d não
nulo.
40
Aniquilando sequencias

! 0 =0
! 1 =1 !
!>1:!! ! =! !−1 +! !−2
!
!

41
Passo 1: Encontrar Aniquilador

!" =< 0,1,! 2 ,…,! ! >


!"# =< 1,! 2 ,…,! ! +1 >
!!!" =< ! 2 = ! 1 +! 0 ,…,! ! +2 = ! ! +1 +! ! > !
(!! −! −1)!" =< !(1)+!(0)−1−0,…,! ! +1 +! ! −!(! +1)−!(!) >
< 0,0,…,0 >
!
!
42
Passo 2: Fatorar o 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):

t(n)= !!!!! +!!!!!!

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
! ! = !!!!! +!!!!!

t(n)= 0,25!3! −0,25!(−1)!

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=2 à T(2) =2T(1) + 2 = 4 e cn lg n = c * 2 * lg 2 = 2c

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⎦

T (⎣n / 2⎦) ≤ c ⎣n / 2⎦ lg⎣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) = T ( ⎣n / 2⎦) + T ( ⎡n / 2⎤) + 1 é O(n) ???

Mostrar que T(n) ≤ cn

T (n) ≤ c( ⎣n / 2⎦) + c( ⎡n / 2⎤) + 1 = cn + 1 Parece incorreto !!


Nova tentativa T(n) ≤ cn-b

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

Você também pode gostar