Você está na página 1de 7

Universidade Federal de Minas Gerais

Departamento de Cincia da Computao


Algoritmos e Estruturas de Dados II

1 Lista de Exerccios - GABARITO

- Esta lista dever ser entregue para os professores durante a aula do dia 13 de setembro de 2011. No
sero recebidas listas por e-mail.
- Todos os programas devem ser feitos em C.

1. So dados 2n nmeros distintos distribudos em dois vetores com n elementos A e B ordenados de maneira
tal que:

A[1] > A[2] > A[3] > ... > A[n] e B[1] > B[2] > B[3] > ... > B[n]

Apresente um algoritmo linear para encontrar o n-simo maior nmero dentre estes 2n elementos.

Para encontrar o maior elemento, basta comparar o elemento A[1] com B[1], o maior ser o maior elemento
do conjunto. Para encontrar o segundo maior elemento, basta comparar o elemento A[1] com B[1]. Se o
A[1] for o maior, basta compara o A[2] com o B[1], seno sero comparados os elementos A[1] com B[2].
Neste caso, sero necessrias 2 comparaes. Para encontrar o n-simo maior elemento, basta realizar n
comparaes.

2. Considere o problema de encontrar a posio de insero de um novo elemento em um conjunto ordenado:

A[1] > A[2] > A[3] > ... > A[n]

a) Apresente a situao e/ou entrada de dados em que ocorre o melhor caso e o pior caso.
b) Apresente um algoritmo para resolver o problema acima.

a) Resoluo atravs de busca binria. Existem n+1 lugares possveis para inserir este novo elemento.
Melhor caso: elemento ser inserido aps o elemento que est na posio n/2(.
Pior caso: elemento ser inserido na posio 1 ou n+1. Para inserir um novo elemento sero necessrias,
no pior caso log(n + 1) comparaes.

3. Considere a funo abaixo:

int X(int a)
{
if (a<=0) then
return 0;
else
return (a + X(a-1));
}

a) O que essa funo faz?
b) Calcule a sua ordem de complexidade. Mostre como voc chegou a esse resultado.
c) Escreva uma funo no-recursiva que resolve o mesmo problema. Qual a ordem de complexidade da
sua funo? Explique.
d) Qual implementao mais eficiente? Justifique.

a) Calcula o somatrio de 0 at n(a)
b) Equao de recorrncia:
T(n) = c + T(n-1), p/ n > 0
T(n) = d p/ n = 0

T(n) = O(n)

c) A implementao no recursiva tambm seria O(n). Nesse caso, apesar das
complexidades serem as mesmas, a funo no recursiva preferida por ser
simples de implementar e no necessitar de mltiplas chamadas de funo
(economia de memria e tempo).


4. Considere que a multiplicao de matrizes O(n
3
). Se voc tivesse a opo de utilizar um algoritmo
exponencial O(2
n
) para multiplicar duas matrizes, qual algoritmo voc iria preferir? Justifique.

Se voc tivesse a opo de utilizar um algoritmo exponencial O(2
n
) para multiplicar duas matrizes, ele s
valeria a pena para n < 10. A partir da, o algoritmo exponencial torna-se mais caro que o algoritmo O(n
3
).

5. O Casamento de Padres um problema clssico em Cincia da Computao e aplicado em reas
diversas como pesquisa gentica, editorao de textos, buscas na internet, etc. Basicamente, ele consiste em
encontrar as ocorrncias de um padro P de tamanho m em um texto T de tamanho n. Por exemplo, no
texto T = BELO HORIZONTE o padro P = ORI encontrado na posio 6 enquanto o padro P =
ORA no encontrado. O algoritmo mais simples para o casamento de padres o algoritmo da Fora
Bruta, mostrado abaixo. Analise esse algoritmo e responda: qual a funo de complexidade do nmero de
comparaes de caracteres efetuadas no melhor caso e no pior caso. D exemplos de entradas que levam a
esses dois casos. Explique sua resposta!

typedef char TipoTexto[MaxTexto];
typedef char TipoPadrao[MaxPadrao];

void ForcaBruta (TipoTexto T, int n, TipoPadrao P, int m)
//-- Pesquisa o padrao P[0..m-1] no texto T[0..n-1] --
{
int i, j, k;

for (i = 0; i < n; i++) {
k = i;
j = 0;
while ((j < m) && (T[k] == P[j])) {
k++;
j++;
}
if (j == m) {
printf("Casamento na posicao %d\n", i);
break; // sai do for
}
}
}




- Melhor Caso: padro encontrado na primeira posio. O for vai ser executado 1 vez e o while m vezes.
Portanto, o nmero de comparaes vai ser O(m).
Exemplo: T : Prova de AEDSII P: Pro

- Pior caso: uma seqncia de caracteres quase igual ao padro se repete no texto, com a nica diferena
sendo o ltimo caractere. Dessa forma, o while ser executado m vezes para cada iterao do for, que ser
executado n-m+1 vezes. Portanto, o nmero de comparaes ser (n-m+1).(m) Pior caso: O(m.n)
Exemplo: T: aaaaaaaaaaaa P: aaab


6. Vrios algoritmos em computao usam a tcnica de Dividir para Conquistar: basicamente eles fazem
alguma operao sobre todos os dados, e depois dividem o problema em sub-problemas menores, repetindo
a operao. Uma equao de recorrncia tpica para esse tipo de algoritmo mostrada abaixo. Resolva essa
equao de recorrncia.

T(n) = 2T(n/2) + n;
T(1) = 1;
) log . ( ) ( n n O n T
2
=


7. Indique para cada par de expresses (A,B) na tabela abaixo, se A O, o, O, e ou O de B. Assuma que k > 1
e 0 < c < 1 < c so constantes. Sua resposta deve ser da forma SIM ou NO.
Nota:


k
k
n n log log log = e
n
e
n
n |
.
|

\
|
~ ! .
A B O o
O e O
(i)
n
k
log
c
n
S S N N N
(ii) k
n
n
c
S S N N N
(iii) n
c
2 n
c
N N S S N
(iv) ) ! log( n
) log(
n
n
S N S N S
(v)
n
k 1
log
+
n
k
log
S S N N N
(vi) c
c
c
) 1 ( + c
S N S N S


8. Qual algoritmo voc preferiria: um que requer n
5
passos ou um que requer 2
n
passos? Justifique sua
resposta.
Depende do tamanho do problema. Teremos n
5
> 2
n
para n < 23, portanto 2
n
melhor ; para n >= 23, n
5

melhor. No limite, uma complexidade polinomial melhor que uma complexidade exponencial para
problemas grandes.





9. Indique se as afirmativas a seguir so verdadeiras e justifique sua resposta:
a) 2
n+1
= O(2
n
)
Verdadeira: existem constantes positivas c e m tais que 2
n+1
<= 2
n
para todo n >= m; exemplo: c = 3 e m =
0.

b) 2
2n
= O(2
n
)
Falsa: 2
2n
= 4
n
, e portanto no existem constantes positivas c e m que atendam definio neste caso.

c) f(n) = O(u(n)) e g(n) = O(v(n)) f(n) + g(n) = O(u(n) + v(n))
Verdadeira: na primeira parte, existem constantes positivas c e m tais que f(n) <= c
1
.u(n) para n>= m1 e
g(n) <= c
2
.v(n) para n>= m
2
. Portanto, f(n) + g(n) <= c1u(n) + c2 v(n) para c = max(c1, c2) e m =
max(m1, m2). Essa constatao equivale a considerar como complexidade o mximo das duas funes.

d) f(n) = O(u(n)) e g(n) = O(v(n)) f(n) g(n) = O(u(n) v(n))
Falsa: se f(n) g(n) = O(u(n)) O(v(n)) = O(u(n))+(-1)O(v(n)); como -1 uma constante, ela pode ser
desconsiderada, de acordo com as propriedades da notao O. Portanto, f(n) g(n) = O(u(n)) + O(v(n)) =
O(max(u(n), v(n)). Observe que a notao O corresponde relao de menor que ou igual a(<=), que
alterada pela subtrao e pela diviso.

10. Considerando que a operao relevante o nmero de vezes que a operao soma executada, apresente a
funo de complexidade de tempo para:

a)
for i 1 to n do
for j 1 to n do
for k 1 to n do
temp temp + i + j + k

= = =
= =
n
i
n
j
n
k
n
1 1
3
1
3 ... 3



b)
for i 1 to n do
for j 1 to i do
for k 1 to j do
temp temp + i + j + k

= = =
+ + = =
n
i
i
j
j
k
n
n n
1 1
2 3
1
2
3
2
... 3









c)
for i 1 to n do
for j 1 to n do
for k i to n do
temp temp + i + j + k

= = =
+ = =
n
i
n
j
n
i k
n n
1 1
2 3
2
3
2
3
... 3


d)
for i 1 to n do
for j i to n do
for k i to n do
temp temp + i + j + k

= = =
+ + = =
n
i
n
i j
n
i k
n n
n
1
2
3
2 2
3
... 3


e)
for i 1 to n do
for j i to n do
for k i to j do
temp temp + i + j + k

= = =
+ + = =
n
i
n
i j
j
i k
n
n n
1
2 3
2
3
2
... 3


11. Resolva as seguintes equaes de recorrncia:

a) T(n) = T(n 1) + c c constante, n > 1
T(1) = 0
c cn n T = ) (

b) T(n) = T(n 1) + 2
n
n > 1
T(0) = 1
1 2 ) (
1
=
+ n
n T

c) T(n) = cT(n 1) c, k constantes, n > 0
T(0) = k
k c n T
n
= ) (

d) T(n) = 3T(n/2) + n n > 1
T(1) = 1
n n n T 2 3 ) (
3 log
=






e) T(n) = 3T(n 1) 2T(n 2) n > 1
T(0) = 0
T(1) = 1
1 2 ) ( =
n
n T

12. Considere o algoritmo a seguir, supondo que a operao crucial inspecionar elemento. O algoritmo
inspeciona os n elementos de um conjunto e, de alguma forma, consegue descartar 2/5 dos elementos e fazer
uma chamada recursiva sobre os 3n/5 elementos restantes.
a) Escreva uma equao de recorrncia que descreva esse comportamento
b) Converta a equao de recorrncia para um somatrio
c) D a frmula fechada para esse somatrio

void Pesquisa (int n)
{
if (n < 1)
inspecione elemento;
termine;
else {
para cada um dos elementos, inspecione elemento;
Pesquisa(3 * n / 5);
}
}

=
+
|
.
|

\
|
=
1 ) 1 (
5
3
) (
T
n n T n T

2
3
2
5
) ( = n n T

13. Torre de Hani. Em 1883, o matemtico francs Edouard Lucas criou um jogo chamado Torre de Hani. O
jogo comea com um conjunto de oito discos empilhados em tamanho decrescente em uma das trs varetas,
conforme mostrado na Figura 1. O objetivo do jogo transferir toda a torre para uma das outras varetas,
movendo um disco de cada vez, mas nunca movendo um disco maior sobre um menor.

Figura 1: Configurao inicial da Torre de Hani.

=
+ =
1 ) 1 (
1 ) 1 ( 2 ) (
T
n T n T

1 2 ) ( =
n
n T
14. Linhas no plano ou Cortando a sua pizza favorita. Quantas fatias de pizza uma pessoa pode obter ao
fazer n cortes retos com uma faca? Ou, expressando de outra forma, qual o nmero mximo de regies L
n

determinado por n retas no plano? Lembre-se que um plano sem nenhuma reta tem uma regio, com uma
reta tem duas regies e com duas retas tem quatro regies, conforme mostrado na figura 2.









Figura 2: Regies no plano.

=
+ =
1 ) 0 (
) 1 ( ) (
T
n n T n T

2
2
) (
2
+ +
=
n n
n T

15. Use o teorema mestre para derivar um limite assinttico O para as seguintes recorrncias:
a) T(n) = 2T(n/2) + n 1

) log ( ) ( n n n T O =

b) T(n) = 3T(n/2) + n
) ( ) (
3
2
log
n n T O =

c) T(n) = 4T(n/2) + n
2

) log ( ) (
2
n n n T O =

d) T(n) = 4T(n/2) + n
3

) ( ) (
3
n n T O =

Frmulas teis:

= =
+
= =

= =
+
= =
n
i
n
i
n
i
n i
n
i
n
i
a
a
a a
n n
i k n k
1 0
1
1 1
1
1
1 2 2
2
) 1 .(
.


1
1
2
2
1
3
4
L
0
=1 L
1
=2 L
2
=4