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

(2,0): Res