Data:
12/03/2003
Redatora: Camila Ribeiro Rocha
Capítulo 4: Recorrências
Seção
Problemas
4-4 Outros exemplos
de recorrência (p. 69)
Forneça
limites assintóticos superiores e inferiores para T(n) em cada
uma das recorrências a seguir. Suponha que T(n) seja constante
para n suficientemente pequeno. Torne seus limites tão restritos quanto
possível e justifique suas respostas.
a) T(n) = 3T(n/2) + n lg n
O método escolhido foi o método mestre. Sendo assim, considerando a forma da equação padrão,
T(n) = aT(n/b) + f(n)
os valores das variáveis da equação dada são:
a = 3
b = 2
f(n) = n lg nObservando f(n), constatou-se que a recorrência recairia no caso 1 do método mestre, que considera que f(n) = O (nlogba - E). Substituindo as variáveis,
f(n) = O (nlog23 - E) = O (nlg3 - E) = O (n1,58 - E)
Considerando E = 0,08:
f(n) = O (n1,5), então T(n) = THETA(nlg 3)
Portanto, o limite assintótico da recorrência é THETA(nlg 3)
f) T(n) = T(n/2) + T(n/4) + T(n/8) + n
Para obter o resultado, foi utilizado o método da árvore. A árvore resultante foi:
O número de folhas foi calculado utilizando-se a fórmula:
n° folhas = (n° de filhos)altura da árvore = nlg 3.
Para esse cálculo, a árvore foi considerada balanceada, uma aproximação para facilitar os cálculos (ela não é balanceada pois cada ramo cresce em uma proporção distinta). Assim, para a inserção do número de folhas na fórmula para o cálculo de recorrência, a notação THETA não poderá ser utilizada. Utilizou-se então a notação O, já que apenas o limite superior é garantido.
Extraindo as informações da árvore, tem-se a nova forma da recorrência:
T(n) = n + 7/8*n + (7/8)²*n + ... + (7/8)i*n + O (nlg3)
Resolvendo a recorrência:
T(n) = n + 7/8*n + (7/8)²*n + ... + (7/8)i*n + O (nlg3)
lg(n-1)
T(n) = n * Soma(7/8)i + O (nlg3)
i=0
infinito
T(n) = n * Soma(7/8)i + O (nlg3)
i=0
T(n) = n*(1 / (1 - 7/8)) + O (nlg3)T(n) = O (nlg3) (aproximadamente)
Chegou-se a um limite superior. O próximo passo é aplicar o método da substituição para tentar obter um limite mais preciso.
Supor que T(n) = O (nc), sendo c >= 1. Neste caso, queremos mostrar que T(n) <= nc:
T(n) = T(n/2) + T(n/4) + T(n/8) + n
<= (n/2)c + (n/4)c + (n/8)c + n
= nc * ((1/2)c + (1/4)c + (1/8)c) + n
Majorando (1/2)c + (1/4)c + (1/8)c, considerando que o máximo (7/8) ocorre quando c = 1:
<= (7/8)*nc + n
Majorando n para (1/8)nc, o que é válido apenas para c > 1 e n >= um certo no
<= (7/8)*nc + (1/8)*nc
<= 1nc como queríamos demonstrar
Ainda é possível restringir mais o limite, supondo T(n) = O(n):
Suposição: T(n) <= cn
T(n) <= cn/2 + cn/4 + cn/8 + n
<= c*(7/8)*n + n
= (7c/8 + 1)*n
Cálculo do valor da constante c para validar a regra (7c/8 + 1)n <= cn
(7c/8 + 1)*n <= cn
7c + 8 <= c
c >= 8
Testando a constante c na relação original:
T(n) <= 8*(n/2) + 8*(n/4) + 8*(n/8) + n
= 4n + 2n + n + n
= 8n
Teste para o caso base:
T(1) = 1 <= 8 Sucesso
Portanto, T(n) = O(n).
O limite assintótico superior O(n) obtido também pode ser considerado o valor do limite assintótico inferior, pois a recorrência será no mínimo n (já que possui um termo desta ordem de grandeza) e no máximo 8n, como demonstrado.
Portanto, o limite assintótico da recorrência é THETA(n).
i) T(n) = T(n - 2) + 2 lg n
Resolvido pelo método da iteração:
T(n) = T(n - 2) + 2 lg n
= T(n - 4) + 2 lg (n - 2) + 2 lg n
= T(n - 6) + 2 lg (n - 4) + 2 lg (n - 2) + 2 lg n
...
Chega-se ao formato genérico:
n/2
= Soma (2 lg (n - 2i))
i=1Retirando o somatório para o cálculo da complexidade:
= 2[ lg n + lg (n - 2) + lg (n - 4) + ... + lg 4 + lg 2]
= 2 lg [ n*(n - 2)*(n - 4)* ... *4*2 ]
Multiplicando e dividindo cada termo por 2:
= 2 lg { (2n/2)*[2(n - 2)/2]*[2(n - 4)/2]* ... *[2.4/2]*[2.2/2] }
= 2 lg { (2n/2)*[(n/2)*(n/2 - 1)*(n/2 - 2)* ... *2*1] }
= 2 lg [ (2n/2)*(n/2)! ]
= 2[ lg (2n/2) + lg (n/2)! ]
= 2[ n/2 + lg (n/2)! ]
= n + 2 lg (n/2)!
<= n + 2 THETA( (n/2) lg (n/2) ) = THETA(n lg n)
Portanto, o limite assintótico da recorrência é THETA(n lg n).