(2,0): Res - Faccamp
(2,0): Res - Faccamp
(2,0): Res - Faccamp
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Faculdade Campo Limpo Paulista<br />
Mestrado em Ciência da Computação<br />
Complexidade de Algoritmos – Avaliação 2<br />
1. (2,0): <strong>Res</strong>olva a seguinte relação de recorrência.<br />
T(n) = T(n – 1) + 3<br />
T(1) = 3<br />
Pelo método iterativo progressivo.<br />
T(1) = 3<br />
T(2) = T(1) + 3 = 3 + 3 = 6<br />
T(3) = T(2) + 3 = 3 + 3 + 3 = 9<br />
T(4) = T(3) + 3 = 3 + 3 + 3 + 3 = 12<br />
...<br />
T(n) = 3n<br />
1
2. (2,0): Membros antigos da Sociedade de Pitágoras definiram números figurados<br />
como sendo o número de pontos em uma certa configuração geométrica. Os<br />
primeiros números triangulares são 1, 3, 6 e 10 e são semelhantes aos diagramas<br />
das figuras ilustradas abaixo. Ache uma fórmula para Q(n), onde Q(n) é a<br />
quantidade de números triangulares (pontos) para a figura de ordem n. Prove, por<br />
indução, que a sua fórmula está correta.<br />
1 ponto<br />
3 pontos<br />
6 pontos<br />
n = 1 2<br />
3 4<br />
2<br />
10 pontos<br />
Percebe-se que a soma dos pontos na figura de ordem n é igual a 1 + 2 + 3 + 4 + ... + n. Logo<br />
propomos Q(n) = n (n + 1) / 2, para n ≥ 1.<br />
Provaremos, por indução em n, que Q(n) é verdadeira.<br />
i) Base.<br />
Para n = 1, a figura tem um ponto. Pela fórmula Q(1) = 1 ( 1 + 1 ) / 2 = 1. Logo, a fórmula é<br />
verdadeira para n = 1.<br />
ii) Hipótese de indução.<br />
Vamos assumir que a fórmula é verdadeira para n – 1, n ≥ 2. Ou seja, estamos assumindo, por<br />
hipótese, que Q(n – 1) = (n – 1) n / 2.<br />
iii) Relação entre a quantidade de pontos da figura de ordem n ( Q(n) ) com a quantidade de<br />
pontos da figura de ordem n – 1 ( Q(n – 1) ).
... ...<br />
3<br />
...<br />
Q ( n - 1)<br />
n pontos<br />
Observando o esquema acima, inferimos que Q(n) = Q(n – 1) + n.<br />
Q ( n )<br />
iv) Prova do fato de que Q(n – 1) sendo verdadeira implica no fato de que Q(n) é verdadeira.<br />
Q(n) = Q(n – 1) + n.<br />
Q(n) = (n – 1) n / 2 + n.<br />
Q(n) = ( n 2 – n + 2 n ) / 2.<br />
Q(n) = (n 2 + n ) / 2.<br />
Q(n) = n (n + 1) / 2.
3. (2,0): Prove, por indução, que a soma dos ângulos internos de um polígono convexo<br />
de n lados (n ≥ 3) é igual a S(n) = (n – 2) . 180 o . Dicas: (i) a base (n = 3) está<br />
resolvida abaixo; (ii) tente expressar a soma dos ângulos internos de um polígono<br />
convexo de n lados como função da soma dos ângulos internos de um polígono<br />
convexo de n - 1 lados.<br />
i) Base.<br />
Para n = 3 temos um triângulo. Pela figura abaixo, infere-se que a + b + c = 180º.<br />
Pela fórmula S(3) = (3 – 2) . 180 o = 180º. A fórmula é verdadeira para a base.<br />
ii) Hipótese de indução.<br />
S (n – 1) = (n – 3 ) . 180º, n ≥ 4.<br />
b<br />
iii) Relação entre a soma dos ângulos internos de um polígono convexo de n lados e tal soma<br />
em um polígono convexo de n – 1 lados.<br />
Pela ilustração acima, infere-se que S(n) = S(n – 1) + 180º.<br />
a<br />
4<br />
B<br />
b<br />
a + b + c = 180 o<br />
A c<br />
C<br />
c
iv) Prova do fato de S(n – 1) ser verdadeira implica que S(n) é verdadeira.<br />
S(n) = S(n – 1) + 180º.<br />
S(n) = (n – 3).180º + 180º.<br />
S(n) = (n – 2).180º.<br />
5
T(1)<br />
4. Calcule a complexidade do algoritmo a seguir.<br />
Algoritmo A(n)<br />
Entrada: n, inteiro, n ≥ 1.<br />
{<br />
se (n = 1)<br />
retornar 1<br />
senão<br />
retornar A(n/2) + 1<br />
}<br />
Algoritmo A(n)<br />
Entrada: n, inteiro, n ≥ 1.<br />
{<br />
se (n = 1) T(n/2)<br />
retornar 1<br />
senão<br />
retornar A(n/2) + 1<br />
}<br />
tempo para fazer 1 soma<br />
T(n) = T(n/2) + 1<br />
T(1) = 0<br />
Esta relação de recorrência é do tipo “dividir para conquistar”, T(n) = aT(n/b) + cn k , cuja<br />
solução está tabelada.<br />
Neste caso a = 1 ( a ≥ 1, OK ), b = 2 ( b ≥ 2, OK ), c = 1 e k = 0 (c e k constantes, OK).<br />
Como a = 1 > b k = 2 0 = 1, então<br />
T(n)<br />
T(n) = O ( n k log n ) = O ( log n ).<br />
6
5. (2,0): Aplicando a técnica indutiva de design de algoritmos, escreva um algoritmo<br />
que receba um conjunto A de n inteiros, um inteiro k e determine se existe um<br />
subconjunto B de A tal que a soma dos elementos de B seja igual a k. Por exemplo,<br />
se A = {2, 5, 8, 9, 15, 18} e k = 22 então a resposta do algoritmo deve ser sim<br />
(verdadeiro), pois existe um subconjunto B = {2, 5, 15} cuja soma é igual a 22. Não<br />
é necessário calcular a complexidade do seu algoritmo.<br />
Observação: para facilitar a escrita do algoritmo, considere poder utilizar na sua solução as<br />
seguintes expressões:<br />
• C := A ∪ B: constrói um conjunto C formado pela união dos conjuntos A e B.<br />
• C := A ∩ B: constrói um conjunto C formado pela interseção dos conjuntos A e B.<br />
• A [i]: representa o i-ésimo elemento do conjunto A.<br />
i) Interface<br />
Sub (A, n, k).<br />
ii) Significado<br />
Sendo A um conjunto de n elementos, retorna verdadeiro caso exista um subconjunto de A cuja<br />
soma dos elementos seja igual a k. Caso contrário, retorna falso.<br />
iii) Redução<br />
Comandos<br />
B := A – { A [n] };<br />
se ( Sub (B, n – 1, k) = verdadeiro )<br />
retornar verdadeiro<br />
senão<br />
retornar Sub (B, n – 1, k – A [n] )<br />
iv) Base<br />
A redução ocorre de 1 em 1. Propomos uma base para n = 1. Neste caso, basta comparar A[1]<br />
com k. Se forem iguais retornamos verdadeiro e, caso, contrário, retornamos falso.<br />
Comandos<br />
se ( A [1] = k )<br />
retornar verdadeiro<br />
senão<br />
retornar falso<br />
7
T(1)<br />
v) Algoritmo<br />
Algoritmo Sub (A, n, k)<br />
{<br />
se (n = 1) // BASE<br />
{<br />
se ( A [1] = k )<br />
retornar verdadeiro<br />
senão<br />
O (n)<br />
retornar falso<br />
}<br />
senão // REDUÇÃO<br />
{<br />
T(n - 1)<br />
B := A – { A [n] };<br />
se ( Sub (B, n – 1, k) = verdadeiro )<br />
retornar verdadeiro<br />
senão<br />
retornar Sub (B, n – 1, k – A [n] )<br />
}<br />
}<br />
vi) Complexidade<br />
T(n) = 2 T(n – 1) + O(n)<br />
T(1) = 1<br />
T(n)<br />
<strong>Res</strong>olvendo-se esta relação de recorrência chega-se a<br />
T(n) = O (2 n ).<br />
8<br />
T(n - 1)
6. (2,0): (opcional 1 n<br />
): Prove, por indução, que S n)<br />
= ∑<br />
i=<br />
1<br />
9<br />
2<br />
( i é O(n 3 ).<br />
2<br />
Temos que mostrar que existem c > 0 e N tais que S(<br />
n)<br />
= ∑ i ≤ c n<br />
i=<br />
1<br />
3 para n ≥ N.<br />
Base<br />
para i = 1, temos S(1) = 1 2 = 1 ≤ c 1 3 . Logo c ≥ 1 (para satisfazer a base).<br />
Hipótese de indução<br />
n<br />
∑<br />
i=<br />
1<br />
2<br />
S(<br />
n −1)<br />
= i ≤ c (n – 1) 3 para n ≥ N.<br />
Redução<br />
S (n) = 1 2 + 2 2 + 3 2 + ... + (n – 1) 2 + n 2<br />
S (n - 1) = 1 2 + 2 2 + 3 2 + ... + (n – 1) 2<br />
Logo, propomos a redução S(n) = S (n -1) + n 2 .<br />
Prova de que a validade do teorema para S(n – 1) implica na validade do teorema<br />
para S(n)<br />
S(n) = S (n -1) + n 2<br />
S(n) ≤ c (n – 1) 3 + n 2<br />
Para provarmos o que queremos temos que conseguir mostrar que S(n) ≤ c n 3 , ou seja,<br />
mostrar que S(n) ≤ c (n – 1) 3 + n 2 ≤ c n 3 . Se mostrarmos que existe c > 0 que satisfaz as<br />
condições desta inequação para n ≥ N estará provado.<br />
c (n – 1) 3 + n 2 ≤ cn 3<br />
c (n 3 -3n 2 + 3n – 1) + n 2 ≤ cn 3<br />
cn 3 -3cn 2 + 3cn – c + n 2 ≤ cn 3<br />
(-3c + 1) n 2 + 3cn – c ≤ 0<br />
Seja c = 1. Assim, obtemos<br />
-2n 2 + 3n – 1 ≤ 0.<br />
As raízes de -2n 2 + 3n – 1 são 1/2 e 1. Como o coeficiente do termo n 2 é negativo (parábola<br />
com a “boca” direcionada para baixo) esta inequação é verdadeira para n ≤ 1/2 (não nos<br />
interessa) e para n ≥ 1. Dizemos, portanto, que N = 1.<br />
1 Poderá ser utilizada para substituir algum dos exercícios anteriores.<br />
n
2<br />
Logo, existem c > 0 ( c = 1 ) e N ( N = 1 ) que satisfazem S(<br />
n)<br />
= ∑ i ≤ c n<br />
i=<br />
1<br />
3 para n ≥ N.<br />
Está, portanto, provado que<br />
n<br />
∑<br />
i=<br />
1<br />
2<br />
S(<br />
n)<br />
= i é O(n 3 ).<br />
10<br />
n