You are on page 1of 10

Projeto e Anlise de

Algoritmos

Prof. Dr. Murilo Naldi

naldi@dc.ufscar.br
Resoluo Prova 1

Projeto e Anlise de Algorimtos


Questo 1
Questo 1. Em uma rede social, usurios podem ter seus dados convertidos em
nmeros, que por sua vez so armazenados em vetores, ou seja, um vetor de
valores reais de tamanho d por usurio. Uma empresa lana um novo produto
voltado para um determinado tipo de usurio pr-definido, tambm representado
por um vetor de valores reais de tamanho d. Ela compra as informaes, em forma
de vetores, sobre n usurios da rede social. Faa um algoritmo baseado em
diviso em conquista que, dado os n usurios da rede social e o usurio pr-
definido como entradas, seja capaz de encontrar o usurio da rede social mais
semelhante ao usurio pr-definido. Assuma que exista uma funo pr-definida
que seja capaz de calcular a semelhana entre dois usurios passados como
entrada (no precisa implementar, s usar). Alm de implementar, responda, com
clculos que sustentem suas argumentaes, as seguintes questes:

Projeto e Anlise de Algoritmos


a) (2.0 pontos) Implemente o algoritmo que use diviso e
conquista para resolver esse problema, ou seja, retorne o
usurio mais prximo do pr-definido.
1.. funcao_maisproximo(usuarios[][],pdefinido[],l_sup, l_inferior)
2.. se l_sup = l_inferior
3. usuario.semelhanca <- semelhanca(usuarios[l_sup],pdefinido)
4. usuario.posicao <- l_sup
5. retorna usuario
6. seno
7. aux <- teto((l_sup l_inferior)/2)
8. usuario1 <- funcao_maisproximo(usuarios,pdefinido,l_sup,aux)
9. usuario2 <- funcao_maisproximo(usuarios,pdefinido,aux-1,l_inferior)
10. se usuario1.semelhanca > usuario2.semelhanca entao
11. retorna usuario1
12. senao
13. retorna usuario2
14. fimse
15. fimse
16. fimfuncao
b) (1.0 pontos) Dado que o clculo da semelhana entre dois usurios
possui complexidade linear em d, calcule a complexidade do algoritmo
que voc implementou, em relao n e d (j que voc no sabe qual
deles maior).
Considerando o formato T(n) = a.T(n/b) + f(n), temos
para a implementao que b=2, a=2 e f(n) constante,
portanto (1).
Se f(n) (nd) e (1), ento d = 0. Pelo Teorema
Mestre, temos que a>bd, pois 2<1 e, portanto o
algoritmo (n).
Ao considerar que o clculo da semelhana possui
complexidade igual ao tamanho do vetor (d, mas no
confundir com o d do teorema mestre) e calculado
para cada usurio, ento algoritmo (nd) quando d
for considerado o tamanho do vetor.
c) (2.0 pontos) Suponhamos que o algoritmo fosse modificado para encontrar os k usurios mais prximos do pr-definido.
Assuma que os valores de semelhana entre os n usurios e o usurio pr-definido sejam armazenados em um vetor de tamanho
n. Calcule as complexidades: i) de encontrar no vetor os k usurios mais semelhantes ao pr-definido, se os valores de
semelhana no estiverem ordenados; ii) de inserir todos os valores no vetor de forma a manter ele ordenado sempre; iii) de
ordenar o vetor totalmente preenchido e, posteriormente, encontrar os k usurios mais semelhantes ao pr-definido. Qual a
melhor estratgia para obter os k mais semelhantes, considerando que o valor de k pode variar no intervalo [1,n]? Ela muda de
acordo com o valor de k?

i) Cada insero T(1). Cada busca T(n) no pior


caso. Portanto O(kn).
ii) No pior caso, T(n) = 0+1+2+3+...+n-1 mudanas
no vetor. Portanto, T(n) = ((n-1)(n-1 + 1))/2 = (n 2-
n)/2. Cada busca no vetor ordenado O(1).
Portanto, O(n2 + k).
iii) Uma ordenao eficiente O(nlogn). Cada
busca no vetor ordenado O(1). Portanto, O(nlogn
+ k).

Questo 2. (3.0 pontos) Considere a recorrncia F(n) = 2 F(n/2) + 7n +


2 uma funo com n definido no conjunto {20, 21, 22, 23,}. Para F(1)
= 1, encontre a frmula fechada de recorrncia e mostre como voc
chegou at ela.
til comear calculando os valores de F(n)
para valores pequenos de n:

n 1 2 4 8 16 ...
F(n) 1 18 66 190 494

Para encontrar uma frmula fechada, podemos


desenrolar a recorrncia, escrevendo 2k no
lugar de n:
F(n) = F(2k)
= 2F(2k1 ) + 72k + 2
= 2 (2F(2 k2 ) + 72 k1 + 2 ) + 72 k + 2
= 4F(2k2 ) + 142k + 6
= 4 (2F(2k3 ) + 72k2 + 2 ) + 142k + 6
= 8F(2k3) + 212k + 14
= 23 F(2k3 ) + 732k + 223 2
= 2k F(2 kk ) + 7k2 k + 22 k 2
= 2 k F(1) + 7k2 k + 22 k 2
= 2 k + 7k2 k + 22 k 2
= 7k 2 k + 32 k 2 .
Como k = lg n, a frmula fechada pode ser reescrita assim:
F(n) = 7n lg n + 3n 2 .
Questo 3. (2.0 pontos) Faa um algoritmo O(n) que implemente uma busca em uma
matriz n x n em que cada coluna e cada linha esto ordenadas em ordem crescente.
Mostre que ele O(n), calculando sua complexidade. Qual a estratgia de
programao que voc utilizou?
1.busca_matriz(matriz[][],n,elem)
2. para i <- 1 ate n faca
3. se matriz[i][n] = elem
4. retorna verdadeiro
5. senao
6. se matriz[i][n] > elem entao
7. para j = 1 ate n-1 faca
8. se matriz[i][j] = elem
9. retorna verdadeiro
10. fimse
11. fimpara
12. retorna falso
13. fimse
14. fimse
15. fimpara
16.retorna falso
Questo 3. (2.0 pontos) Faa um algoritmo O(n) que implemente uma busca em uma
matriz n x n em que cada coluna e cada linha esto ordenadas em ordem crescente.
Mostre que ele O(n), calculando sua complexidade. Qual a estratgia de
programao que voc utilizou?

Clculo da complexidade pior caso:


T(n) + T(n) = 2T(n)
O(n)
Estratgia utilizada:
decremento e conquista

You might also like