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?