Você está na página 1de 21

Resolvendo a recorrência

1. Árvore de recursão
- Bom para tentar obter a resposta
2. Método da substituição
- Genérico, rígido mas pode ser difícil de ser usado
3. Método Mestre
- Fácil mas de aplicação limitada
Método da substituição

Método mais geral para resolver a recorrência


(provar O e Ω separadamente):

1. Tentar a forma da solução por ex. árvore de


recursão/ método da iteração
2. Verificar por indução (passo indutivo).
3. Resolver para O constantes n0 e c (caso base
da indução)
Prova por substituição

• Recorrência: T(n) = 2T(n/2) + n.


• Tentar: T(n) = O(n log n). (ex. por árvore de recursão)
• Para provar, deve mostrar T(n) ≤ c n log n para algum c > 0 e
para todo n > n0
• Prova por indução: assume que é verdadeiro para T(n/2), provar
que é também verdadeiro para T(n). Significa:

• Fato: T(n) = 2T(n/2) + n


• Suposição: T(n/2)≤ cn/2 log (n/2)
• Precisa provar: T(n)≤ c n log (n)
Prova

• Fato: T(n) = 2T(n/2) + n


• Suposição: T(n/2)≤ cn/2 log (n/2)
• Necessita provar: T(n)≤ c n log (n)

• Prova:
Substituindo T(n/2) ≤ cn/2 log (n/2) na recorrência temos
T(n) = 2 T(n/2) + n
≤ cn log (n/2) + n
≤ c n log n - c n + n
≤ c n log n (se escolhermos c ≥ 1 e n ≥ 2 ).
Prova por substituição

• Recorrência: T(n) = 2T(n/2) + n.


• Tentar: T(n) = Ω(n log n).
• Para provar, temos de mostrar T(n) ≥ c n log n para algum c > 0 e
para todo n > n0
• Prova por indução: assume que é verdade para T(n/2), provar que é
verdadeiro também para T(n). Significa que:

• Fato: T(n) = 2T(n/2) + n


• Suposição: T(n/2) ≥ cn/2 log (n/2)
• Necessita provar: T(n) ≥ c n log (n)
Prova

• Fato: T(n) = 2T(n/2) + n


• Suposição: T(n/2) ≥ cn/2 log (n/2)
• Necessita provar: T(n) ≥ c n log (n)

• Prova:
Substituindo T(n/2) ≥ cn/2 log (n/2) na recorrência temos
T(n) = 2 T(n/2) + n
≥ cn log (n/2) + n
≥ c n log n - c n + n
≥ c n log n (se escolhermos c ≤ 1 e n ≥ 2 ).
Prova

• Demonstramos :
• T(n) = O(n log n)
– T(n) ≤ c n log n (se escolhermos c ≥ 1 e n ≥ 2 ).
• T(n) = Ω(n log n)
– T(n) ≥ c n log n (se escolhermos c ≤ 1 e n ≥ 2 ).
• Se escolhemos c = 1 e n ≥ 2 então satisfazemos:
– T(n) = O(n log n) e T(n) = Ω(n log n) ao mesmo tempo
– Logo T(n) = Θ (n log n)
Prova por substituição

• Recorrência: T(n) = 2T(n1/2) + log n.


• Fazendo m = log n temos :
• T(2m) = 2T(2m/2) + m
• Fazendo S(m) = T(2m) temos :
• S(m) = 2 S(m/2) + m que é similar a T(n) = 2T(n/2) + n
• Após uma demonstração semelhante a anterior temos:
• S(m) = O(m log m)
• Colocando em T(n) :
• T(n) = T(2m) = S(m) = O(m log m) = O(log n log log n)
Exemplos do Método da Substituição

• Provar que T(n) = 3T(n/3) + n = O(nlogn)


• Precisa provar que T(n) <= d n log n para algum d, e um
n grande o suficiente
• Assuma que o dito acima é verdadeiro para T(n/3), i.e.
T(n/3) <= dn/3 log (n/3)
T(n) = 3 T(n/3) + n
<= 3 dn/3 log (n/3) + n
= dn log n – dn log3 + n
<= dn log n quando n – dn log3 <= 0

n – dn log3 <=0 implica d >= 1/log3


Exemplos do Método da Substituição

• Provar que T(n) = T(n/3) + T(2n/3) + n = O(nlogn)


• Precisa provar que T(n) <= d n log n para algum d, e um
n grande o suficiente
• Assuma o dito acima é verdadeiro para T(n/3) e T(2n/3),
i.e.
T(n/3) <= dn/3 log (n/3)
T(2n/3) <= 2dn/3 log (2n/3)
T(n) = T(n/3) + T(2n/3) + n
<= dn/3 log(n/3) + 2dn/3 log(2n/3) + n
= dn/3 ( log n - log 3) + 2dn/3 ( log n + log 2/3) + n
= (dn/3 log n+2dn/3 log n)+n –dn/3 log 3 + 2dn/3 log 2/3
= dn log n + (n – dn ( (log 3) /3 – 2/3 (log 2 – log 3) ))
= dn log n + (n – dn (((log 3) /3 + 2/3(log 3))– 2/3 log 2))
= dn log n + (n – dn (log 3 – 2/3))
= dn log n +( n(1 – dlog3 + 2d/3))
<= dn log n quando 1– d log3 + 2d/3 <= 0
d log3 – 2d/3 >= 1 => d >= 1 / (log3-2/3)
Exemplos do Método da Substituição

• Provar que T(n) = 3T(n/4) + n2 = O(n2)


• Necessita provar que T(n) <= d n2 para algum d, e um n
suficientemente grande
• Assuma que o dito acima e verdadeiro para T(n/4), i.e.
T(n/4) <= d(n/4)2 = dn2/16
T(n) = 3T(n/4) + n2
<= 3 d n2 / 16 + n2
= (3d/16 + 1) n2
<= dn2
?
3d/16 + 1 <= d implica que
d >= 16/13
Fazendo uma boa tentativa

T(n) = 2T(n/2 + 17) + n

Quando n -> infinito, n/2 + 17 não é muito diferente de n/2

Tentar T(n) = Θ(n log n)


Evitando problemas

• Tentar T(n) = 2T(n/2) + n = O(n)


• Necessita provar que T(n) <= c n
• Assume T(n/2) <= cn/2

• T(n) <= 2 cn/2 + n = cn + n = O(n)

• Qual o problema?

• Necessita provar T(n) <= cn, e não T(n) <= cn + n


Detalhes

• Provar que T(n) = T(n/2) + T(n/2) + 1 = O(n)


• Necessita provar que T(n) <= cn
• Assuma que o dito acima e válido para T(n/2) & T(n/2)
T(n) <= c n/2 + cn/2 + 1
= cn + 1
Está correto?
Não! Tem de provar que T(n) <= cn
Mas podemos provar que T(n) = O (n – 1)
Polinômios e. Exponenciais

d i i
• Polinômios: P( n ) = ∑ a n
i =0
– Uma função é polinomialmente limitada se
f (n) = O (n ) O (1)

• Exponenciais:
– Qualquer exponencial positiva cresce mais rápido
que qualquer polinômio

nb
lim n→∞ n
= 0 ( a > 1) n b = o( a n ) ( a > 1 )
a
Logaritmos

• Uma função poli-logaritmo de n é um polinômio do


logaritmo de n

• A função f(n) é limitada em um poli-logaritmo se


f (n ) = O (logO (1) n )
log b n = o(n a )
• Para qualquer constante a > 0.
• Qualquer polinômio positivo cresce mais rápido que
uma função de poli-logaritmo
Iteração de Função

(i )  n ifi = 0,
f ( n) =  (i −1)
f(f (n)) ifi > 0.

(i ) i
Por exemplo, se f ( n ) = 2 n , então f ( n ) = 2 n
Funções de Crescimento Lento

lg* 2 = 1
lg* 4 = 2
lg* 16 = 3
lg* 65536 = 4
lg* 265536 = 5

• Dificilmente encontraremos um n tal que


lg* n > 5

Você também pode gostar