Grupo de 1 a 4 pessoas
Integrantes por ordem de RGM
RGM Nome
if (n < 2)
return 1;
return fib (n-2) + fib (n-1);
}
Considerando a implementação acima, avalie as afirmações a seguir.
I. A complexidade de tempo da função fib é exponencial no valor de n.
II. A complexidade de espaço da função fib é exponencial no valor de n.
III. É possível implementar uma versão iterativa da função fib com complexidade de
tempo linear no valor de n e complexidade de espaço constante.
Identifique as afirmações Verdadeiras e Falsas e JUSTIFIQUE sua resposta para cada afirmativa.
Identifique as afirmações Verdadeiras e Falsas e JUSTIFIQUE sua resposta para cada afirmativa.
4. (Baseadas nas Questões do ENADE 2011 e POSCOMP 2008). Algoritmos criados para
resolver um mesmo problema podem diferir de forma drástica quanto a sua eficiência.
Para evitar este fato, são utilizadas técnicas algorítmicas, isto é, conjunto de técnicas que
compreendem os métodos de codificação de algoritmos de forma a salientar sua
complexidade, levando-se em conta a forma pela qual determinado algoritmo chega à
solução desejada.
Módulo OQueEuFacoRec ( n )
início
se (n < 2) retorna n;
senão retorna OQueEuFacoRec (n - 1)+ OQueEuFacoRec (n - 2);
fim
Identifique as afirmações Verdadeiras e Falsas e JUSTIFIQUE sua resposta para cada afirmativa.
5. (Baseadas nas Questões do ENADE 2011 e POSCOMP 2008). Algoritmos criados para
resolver um mesmo problema podem diferir de forma drástica quanto a sua eficiência.
Para evitar este fato, são utilizadas técnicas algorítmicas, isto é, conjunto de técnicas que
compreendem os métodos de codificação de algoritmos de forma a salientar sua
complexidade, levando-se em conta a forma pela qual determinado algoritmo chega à
solução desejada.
Considerando os diferentes paradigmas e técnicas de projeto de algoritmos, o algoritmo
abaixo:
Módulo OQueEuSouNaoRec ( A, n )
início
posMax ¬ 0;
para (i ¬ 1; i £ n-1; i++) faça
se (A[posMax} < A[i]) então
posMax ¬ i
fim-se
retorne posMax;
fim
V. A complexidade do algoritmo OQueEuSouNaoRec é O(n).
Identifique as afirmações Verdadeiras e Falsas e JUSTIFIQUE sua resposta para cada afirmativa.
6. (Baseadas nas Questões do ENADE 2005 e POSCOMP 2010). Considere que,
durante a análise de um problema de programação, tenha sido obtida a seguinte
fórmula recursiva que descreve a solução para o problema.
0 , se n=1.
T ( n )=
{()
T
n
2
+ n+1 , se n> 1.
1 , se n=1.
T ( n )=
{9T
n
3() + n2 , se n> 1.
1, se n=1.
T ( n )=
{2T ( n−1 ) +1 , se n>1.
0 , se n=1.
T ( n )=
{T ( n−1 )+ n+c , se n> 1.
fib (n) = 0, se n = 0
fib (n) = 1, se n = 1
fib (n) = fib (n - 1) + fib (n - 2), se n > 1
inteiro k;
modulo f( inteiro n )
início
se (n < 2) então
k = 0;
retorna n;
senão
retorna f(n-1, p) + f(n-2, q);
k = p + q + 1;
fim-se
escreve (n, " ", k, ";");
fim
Considerando o algoritmo f, pergunta-se: Quantas chamadas são feitas à função f para
computar f ( 6 )?
12. (Baseada em questão do POSCOMP 2010). Considere o algoritmo Rascunho
recursivo que calcula o produto de dois números naturais u e v de tamanho n:
Rascunho (u, v, n)
início
Se (n == 1) então retorna u * v;
Senão
m n/2;
p piso ( u / 10m )
q u mod 10m;
r piso( v / 10m)
s v mod 10m
pr Rascunho(p, r, m)
qs Rascunho(q, s, m)
ps Rascunho(p, s, m)
qr Rascunho(q, r, m)
x pr * 102*m + (ps + qr) * 10m + qs
retorna x;
fim-se
fim
Seja T(n) o tempo de execução do algoritmo para as entradas u, v e n. Assim,
pede-se:
a. Qual a equação de recorrência do algoritmo Rascunho, tendo por base as
comparações.
b. A partir da Equação obtida no item anterior, determine a complexidade do
algoritmo rascunho.
PROC (n)
início
se n <= 1 então
retorna 1 + n;
senão
retorna PROC(n/2) + PROC(n/2);
fim se
fim
Considerando o algoritmo PROC para uma entrada n > 0, onde n é um número natural.
pede-se:
a. Qual a sua equação de recorrência, tendo por base as comparações.
b. A partir da Equação obtida no item anterior, determine a sua complexidade.
E as afirmações:
início
fim.
15. O trecho de algoritmo para calcular a n n que utiliza uma repetição para a contagem
das multiplicações é dado por:
Pede-se:
Início
Se (i = f) retorna i;
Senão
p OqueEuSou (A, i, piso(( i+f)/2));
q OqueEuSou (A, piso(( i+f)/2) + 1, f);
se A[p] <= A[q] retorna p;
senão retorna q;
fim
Pede-se:
a. Qual técnica de projeto algoritmos foi utilizada. Porquê ?
b. Suponha que o tamanho n do vetor A é dado por n = f – i + 1. Realize o teste do
módulo supondo o vetor A[ 8, 2, 3, 5, 1, 9] e determine o que será retornado com a
chamada OqueEuSou(A, 0, 5)
c. O que faz o módulo OqueEuSou? Descreva sua funcionalidade.
d. Forneça uma equação de recorrência T(n) para este módulo, considerando
somente a operação comparação entre os elementos do vetor A. (1 operação)
e. Resolva a equação de recorrência por qualquer das técnicas estudadas e obtenha
a complexidade assintótica Theta.
if ( n > 0 ) {
quadrado(x-n, y+n, n div 2);
quadrado(x+n, y+n, n div 2);
quadrado(x-n, y-n, n div 2);
quadrado(x+n, y-n, n div 2);
desenha(x, y, n); // desenha o quadrado }
}
a) Analisando somente a operação de comparação, apresente a equação de
recorrência desse módulo.
19. Um tipo especial de função é aquele que contém, em sua descrição, uma ou mais
chamadas a si mesma. Uma função dessa natureza é denominada recursiva. Seja a
função abaixo.
Obs.: div é o quociente de uma divisão sobre números inteiros e mod é o resto de uma
divisão inteira.
Considerando o algoritmo ENIGMA, pergunta-se:
a) Realizar os testes para as chamadas ENIGMA( 9825, 1000) e ENIGMA( 214, 100) e
informar o que será retornado em cada chamada. Obs.: os testes devem constar e
fazer parte da resolução.
b) Qual a funcionalidade da função ENIGMA? Não descrever o que faz cada comando,
mas qual sua utilidade.
c) Considerando somente a operação de comparação (n = 0) para o algoritmo
recursivo ENIGMA, determine a equação de recorrência T(n) para n >= 0. Também,
considere que o operador “div” e “/” tem a mesma funcionalidade.
d) Tendo por base a equação de recorrência obtida no item anterior, resolva-a pelo
teorema mestre e encontre a complexidade assintótica Theta desse algoritmo.
20. Considerando que certo algoritmo forneceu a equação de recorrência abaixo:
Determine:
a) A equação de complexidade T(n) a partir da equação de recorrência.
Determine:
a) A equação de complexidade T(n) a partir da equação de recorrência.
b) O O-grande desse algoritmo pelas suas propriedades.
a) QuickSort e SelectionSort
b) QuickSort, MergeSort, e HeapSort
c) QuickSort e BubbleSort
d) QuickSort, MergeSort e SelectionSort
e) MergeSort e HeapSort
24. (Baseada em questão do POSCOMP 2015). Muitas das recorrências que acontecem
na análise de algoritmos de divisão e conquista têm a forma F(n) = a F(n/b) + c*nk
para F(n) assintoticamente não decrescente, a, b, k ϵ N, a >= 1, b >= 2, k >= 0, e c ϵ
R+. Nessas condições, de acordo com o Teorema Mestre,
27. O problema da Árvore Parcial de Custo Mínimo pode ser resolvido pelo
algoritmo de PRIM. De forma resumida, esse algoritmo:
- Constrói uma sub-árvore que se inicia unindo um vértice qualquer a
seu vizinho mais próximo;
- No início cada vértice é uma sub-árvore, escolhendo cada um deles
para iniciar o processo;
- Seja Ti Ì V o conjunto de vértices da sub-árvore na iteração i e seja
(v, w) | v Î Ti, w Î V – Ti a aresta de menor valor entre V – Ti e Ti.
- Unem-se o vértice w e a aresta (v,w) à sub-árvore vigente, cujo
conjunto de vértices se torna: Ti+1 = Ti È {w}
- O processo termina quando atingimos todos os vértices (T n = V)
Considerando o funcionamento desse algoritmo, pede-se:
a) Qual paradigma ou técnica de programação é utilizada para
solucionar o problema?
b) Justifique.
28. Uma heurística é um algoritmo que pode produzir um bom resultado, ou até
mesmo obter a solução ótima, mas pode também não produzir solução
alguma ou uma solução que está distante da solução ótima.
Considerando a heurística para o problema do Caixeiro Viajante em um
grafo:
1. Inicie em um vértice arbitrário.
2. Procure o vértice mais próximo do último vértice adicionado que não
esteja no caminho e adicione ao caminho a aresta que liga esses dois
vértices.
3. Quando todos os vértices estiverem no caminho, adicione uma aresta
conectando o vértice inicial e o último vértice adicionado.
E o grafo exemplo:
0
5 1
4 2
3
Pede-se:
a. Escreva uma EQUAÇÃO DE RECORRÊNCIA T(n) que descreva este
comportamento.
b. Encontre o Theta pelo Teorema Mestre.
32. Com relação aos métodos de ordenação, relacione a coluna da esquerda com
a coluna da direita.
Considere o produto de uma matriz p x q por outra matriz q x r cujo algoritmo requer
O(pqr) operações. Seja o produto:
Com base no algoritmo estudado em aula, determine qual a sequência que resolve o
produto das matrizes com o menor número de operações.
34. Algoritmos criados para resolver um mesmo problema podem diferir de forma
drástica quanto a sua eficiência. Para evitar esse fato, são utilizadas técnicas
algorítmicas, isto é, conjunto de técnicas que compreendem os métodos de
codificação de algoritmos de forma a salientar a sua complexidade, levando-se em
conta a forma pela qual determinado algoritmo chega à solução desejada.
I. Um algoritmo guloso nem sempre faz escolhas que parecem ser as melhores no
momento, ou seja, escolhas ótimas locais acreditando que estas escolhas o
levem a uma solução ótima global. Por essa estratégia, nem sempre
asseguram-se soluções ótimas, mas, para muitos problemas, as soluções são
ótimas.
II. A técnica de tentativa e erro (Backtracking) efetua uma escolha ótima local, na
esperança de obter uma solução ótima global.
III. O uso de heurísticas (ou algoritmos aproximados) é caracterizado pela ação de
um procedimento chamar a si próprio direta ou indiretamente.
IV. A técnica de programação dinâmica decompõe o processo em um número
finito de subtarefas parciais que devem ser exploradas exaustivamente.
V. A técnica de divisão e conquista pode ser dividida em três etapas: dividir a
instância do problema em duas ou mais instâncias menores; resolver as
instâncias menores recursivamente; obter a solução para as instâncias originais
(maiores) por meio da combinação dessas soluções.
35. Uma heurística é um algoritmo que pode produzir um bom resultado, ou até
mesmo obter a solução ótima, mas pode também não produzir solução
alguma ou uma solução que está distante da solução ótima.
Considerando a heurística para o problema do Caixeiro Viajante em um
grafo:
Seja o grafo abaixo e a tabela que representa a distância entre seus pares de vértices.
5 1
4 2
( ) A expressão ((A > 0) && (A < 1000) && (B > 1) && (B < 10)), da função main,
pode ser substituída pela expressão (!((A <= 0) || (A >= 1000) || (B <= 1) || (B >= 10))),
sem afetar o resultado do comando condicional if nesta expressão.
Além disso, considerando que A e B foram lidos pelo scanf com os respectivos valores
10 e 5. Determine o que será impresso na tela pelos printf.
40. Algoritmos criados para resolver um mesmo problema podem diferir de forma
drástica quanto a sua eficiência. Para evitar este fato, são utilizadas técnicas
algorítmicas, isto é, conjunto de técnicas que compreendem os métodos de
codificação de algoritmos de forma a salientar sua complexidade, levando-se em
conta a forma pela qual determinado algoritmo chega à solução desejada.
Módulo OQueEuSouNaoRec ( A, n )
início
posMax ¬ 0;
para (i ¬ 1; i £ n-1; i++) faça
se (A[posMax} < A[i]) então
posMax ¬ i
fim-se
retorne posMax;
fim