Buscar

Lista 1

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1 
 UNIVERSIDADE FEDERAL DE VIÇOSA 
 DEPARTAMENTO DE INFORMÁTICA 
 INF332 - Projeto e Análise de Algoritmos 
 Prof. José Elias C. Arroyo 
 
Lista de Exercícios 1 
Complexidade de Algoritmos, Crescimento Assintótico de Funções e Relações de Recorrência 
Data de entrega: 22 de setembro de 2014 
 
1. Determine as funções de complexidades de pior caso e de melhor caso dos seguintes algoritmos 
considerando o número de comparações envolvendo elementos das matrizes. Em seguida, obtenha o 
limite mais justo possível, isto é, descreva a complexidade utilizando a notação Θ. 
 
a) 
Enigma(A[0..n-1][0..n-1]){ 
for i := 0 to n-2 do 
for j := i+1 to n-1 do 
if (A[i][j] ≠ A[j][i]) 
return (false); 
return (true); 
} 
b) 
ProcedimentoQ(A[0..n-1][0..n-1]) { 
for i:= 0 to n-1 do { 
j := i+1; 
while (j < n and A[i][j] = 0) do 
j := j+1; 
if (j < n) return (false); 
} 
return (true); 
} 
 
2. Determine a função de complexidade de tempo de pior caso em termos de n e expresse essa complexidade 
usando a notação O. 
 
a) 
Mystery (n){ 
r := 0; 
for i:=1 to n-1 do 
for j:= i+1 to n do 
for k:= 1 to j do 
r := r + 1; 
return (r); 
} 
b) 
Pesky (n){ 
r := 0; 
for i:=1 to n do 
for j:= 1 to i do 
for k:= j to i+j do 
r := r + 1; 
return (r); 
} 
c) 
Conundrum (n){ 
r := 0; 
for i:=1 to n do 
for j:= i+1 to n do 
for k := i+j-1 to n do 
r := r + 1; 
return (r); 
} 
d) 
prestiferous (n){ 
r := 0; 
for i:=1 to n do 
for j:= 1 to i do 
for k := j to i+j do 
for t := 1 to i+j-k do 
r := r + 1; 
return (r); 
} 
 
 
3. Escreve um algoritmo para determinar a distância (diferença) entre os dois elementos mais próximos de 
um array com n números. Determine a complexidade de melhor e pior caso. 
 
 2 
4. Faça um algoritmo para verificar se uma sequência A de m caracteres está contida numa outra sequencia B 
de n caracteres (n ≥ m). Se A está contida em B, o algoritmo deve retornar a posição inicial de A em B, 
caso contrário o valor -1. 
 
5. Sejam duas funções f(n) e g(n) que mapeiam números inteiros positivos em números reais 
positivos. 
Com respeito às notações assintóticas de complexidade, avalie as afirmativas abaixo. 
I. Diz-se que f(n) ∈ O(g(n)) se existe uma constante real c > 0 e existe uma constante 
inteira n0 ≥1 tal que f(n) ≤ c.g(n) para todo inteiro n ≥n0. 
II. Diz-se que f(n) ∈ o(g(n)) se para toda constante real c > 0 existe uma constante inteira 
n0 ≥1 tal que f(n) < c.g(n) para todo inteiro n ≥n0. 
III. Diz-se que f(n) ∈ Ω(g(n)) se existe uma constante real c > 0 e existe uma constante 
inteira n0 ≥1 tal que f(n) ≥ c.g(n) para todo inteiro n ≥n0. 
IV. Diz-se que f(n) ∈ ω(g(n)) se para toda constante real c > 0 existe uma constante 
inteira n ≥1 tal que f(n) > c.g(n) para todo inteiro n ≥n0. 
V. Diz-se que f(n) ∈ Θ(g(n)) se, e somente se, f(n) ∈O(g(n)) e f(n) ∈ (g(n)). 
A análise permite concluir que: 
a) todas as afirmativas são falsas. 
b) todas as afirmativas são verdadeiras. 
c) apenas as afirmativas I e III são verdadeiras. 
d) apenas as afirmativas II e IV são verdadeiras. 
e) apenas a afirmativa V é falsa. 
6. Para cada uma dos seguintes pares de funções f(n) e g(n), determine uma constante c >0 tal que f(n) ≤ 
c.g(n), para todo n≥1. 
a) f(n) = n2 + n + 1, g(n) = 2n3 
b) f(n) = n n + n2, g(n) = n2 
c) f(n) = n2 – n + 1, g(n) = n2/2 
7. Para cada uma dos seguintes pares de funções f(n) e g(n), determine as constantes c >0 e n0 ≥1, tal que 
f(n) ≥ c.g(n), para todo n ≥ n0. 
a) f(n) = n2 – 4n, g(n) = 4n2 
b) f(n) = n2 – n g(n) = 5n + n 
c) f(n) = 2n, g(n) = n3 + n2 
 
8. Sejam TA(n) e TB(n) os tempos de execução de pior caso de dois algoritmos A e B propostos para um 
mesmo problema computacional, em função de um certo parâmetro n. Dizemos que o algoritmo A é mais 
eficiente que o algoritmo B assintoticamente no pior caso quando: 
a) TA(n) = o(TB(n)). 
b) TB(n) = o(TA(n)). 
c) TA(n) = O(TB(n)). 
d) TB(n) = O(TA(n)). 
e) TA(n) = Θ(TB(n)). 
 
9. Diga se a afirmação é verdadeira ou falsa. Justifique sua resposta. 
a) Se f (n)∈ω(g(n)) então f (n)∈Ω(g(n)) 
b) Se f (n)∈Ω(g(n)) então f (n)∈ω(g(n)) 
c) Se f (n)∈ο(g(n)) então f (n)∈Ο(g(n)) 
d) Se f (n)∈O(g(n)) então f (n)∈ο(g(n)) 
e) Se f (n)∈Θ(g(n)) então f (n)∈Ο(g(n)) 
f) Se f (n)∈Θ(g(n)) então f (n)∈Ω(g(n)) 
g) Se f (n)∈Θ(g(n)) então f (n)∈ο(g(n)) 
 3 
h) Se f (n)∈Θ(g(n)) então f (n)∈ω(g(n)) 
i) f (n)∈ω(g(n)) se e somente se g(n)∈ο( f (n)) 
j) Se f (n)∈Ο(g(n)) e h(n)∈Ο(p(n)) então f(n) + h(n) ∈ Ο(g(n) + p(n)) 
 
 
10. Prove (utilizando a definição formal das notações assintóticas ou apresente um contraexemplo) as 
seguintes afirmações: 
a) Se f (n) ∈ Ο(g(n)) então g(n) ∈ Ω(f(n)) 
b) Θ(c.g(n)) = Θ(g(n)), onde c>0. 
 
11. Ordenar as seguintes funções de acordo com a relação de dominância ou ordem de crescimento: 
2n+1, (n – 2)!, 5 log2 (n+100)10, 1+n , 22n, 0.01nn, 0.001n4 + 3n3 + 1, (ln n)2, 3 n , 3n, 2n, log2 n2 
 
12. Usando limites infinitos, prove que: 
a) n n = o(n log2 n) 
b) log2 n = o(n) 
c) n! = O(nn) 
d) 2n = Ω(n4) 
e) 4n2 + 2n + 8 = Θ(n2) 
f) n2 = ω(n log2 n) 
 
13. Para os seguintes pares de funções, diga se f(n) = o(g(n)), f(n) = O(g(n)), f(n) = Ω(g(n)), f(n) = 
ω(g(n)), e/ou f(n) = Θ(g(n)). 
a) f(n) = n2 + n + 1, g(n) = 2n3 
b) f(n) = log n2, g(n) = log n3 + 5 
c) f(n) = n , g(n) = log n3 
d) f(n) = n, g(n) = log2 n 
e) f(n) = 2n, g(n) = 10n2 
f) f(n) = 3n, g(n) = 2n 
g) f(n) = 3710 2 ++ nn , g(n) = 8n + 2 
h) f(n) =2n-1 g(n) = 2n 
 
14. Para cada uma das funções abaixo, determine a classe Θ(g(n)) à qual a função pertence (ou seja, 
obtenha a ordem de crescimento exata): 
a) (n2 + 1)3 
b) 2n log2(n + 2)2 
c) 3710 2 ++ nn 
d) 2n+1 + 3n-1 
 
15. Encontre a ordem de crescimento das seguintes somas (use a notação Θ): 
a) ∑
=
+
n
i
i
0
22 )1( ; b) ∑
−
=
1
2
2
2log
n
i
i ; c) ∑
=
−+
n
i
ii
1
12)1( ; d) ∑∑
−
=
−
=
+
1
0
1
0
)(
n
i
i
j
ji ; e) ∑
=
+−+
n
i
iii
1
24 )2023( 
16. Considere o algoritmo a seguir. 
PROC (n){ 
se n = 1 então retorna 1 + n; 
senão 
 retorna PROC(n/2) + PROC(n/2); 
} 
 4 
Assinale a alternativa que indica corretamente quantas somas são feitas para uma entrada n > 0, 
onde n é um número natural potência de 2. 
a) n 
b) n + log2 n 
c) n log2 n + 1 
d) n2 + n − 1 
e) 2n − 1 
 
 
 
17. Calcule a complexidade de tempo dos seguintes algoritmos 
a) 
int ALGO(int n) { //considere n potencia de 2 
if (n == 1 ) return 1; 
else{ 
for(int i = 1; i<9; i++) z = ALGO(n/2); 
for(int i =1; i<= n*n*n; i++) z = z + 1; 
return z; 
} 
} 
b) 
void ASTERISCO(int n) { 
if (n > 0 ) { 
ASTERISCO(n–1); 
for (int i = n; i > 0; i--) cout<<’*’<<endl; 
ASTERISCO(n–1); 
} 
} 
 
18. Considere a versão do problema das Torres de Hanói com três pinos (A, B e C) na qual qualquer 
movimento do pino A para o pino C (ou do pino C para o pino A) tem que colocar o disco no pino B, ou 
seja, é obrigatório passar pelo pino B. Escreva um algoritmo recursivo para este problema e apresente a 
relação de recorrência para determinar o número de movimentos. Para n = 3 discos, quantos movimentos 
são realizados? 
 
19. Considere o problema das Torres de Hanói com 4 pinos (A, B, C e D). Elabore um algoritmo recursivo 
para movimentar n discos do pino A para o pino D, usando os pinos B e C como auxiliares. Calcule a 
complexidade de tempo do seu algoritmo para valores de n par e impar. Compare o seu algoritmo com o 
algoritmo de 3 pinos com relação ao número de movimentos necessários. 
 
20. Resolva as seguintes relações de recorrências, pelo método de substituição:a) T(n) = 3T(n/3) + n, para n>1, T(1) = 1 (considere n potencias de 3) 
b) T(n) = 7T(n/7) + n, para n>1, T(1) = 1 (considere n potencias de 7) 
c) T(n) = 4T(n/2) + n2 para n>1, T(1) = 1 (considere n potencias de 2) 
d) T(n) = 8T(n/2) + n3 para n>1, T(1) = 1 (considere n potencias de 2) 
 
21. Resolva as seguintes relações de recorrências utilizando a Árvore de Recursão e apresente o limite 
assintótico justo: 
a) T(n) = 2T(n-1) + n, para n>1, T(1) = 0; 
b) T(n) = 3T(n/3) + n, para n>1, T(1) = 1 (considere n potencias de 3) 
 
 5 
22. Usando o Teorema Mestre, determine a ordem de crescimento das funções definidas pelas seguintes 
relações de recorrência: 
a) T(n) = 4T(n/2) + n , para n>1, T(1) = 1 (considere n potencias de 2) 
b) T(n) = 4T(n/2) + n2, para n>1, T(1) = 1 (considere n potencias de 2) 
c) T(n) = 10T(n/3) + n2, para n>1, T(1) = 1 (considere n potencias de 3) 
d) T(n) = 8T(n/2) + n3 para n>1, T(1) = 1 (considere n potencias de 2) 
 
23. Determine a quantidade mínima e máxima de asteriscos a serem impressos pelo seguinte algoritmo. 
void ImprimeAsteriscos (int n, bool x) { 
 int i, j, k; 
 if (x) 
for( i = 1;i< n; i++) cout<<”*”; 
 else for( i = 1; i<=n; i++) 
 for( j = 1; j<=i ;j++) cout<<”*”; 
 for( i = 1; i<n; i++) 
 for( j = 1; j <= i; j++) 
 for( k = j; k>=1 ; k--) cout<<”*”; 
}

Outros materiais