27.08.2013 Views

(2,0): Res - Faccamp

(2,0): Res - Faccamp

(2,0): Res - Faccamp

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!