Baixe o app para aproveitar ainda mais
Prévia do material em texto
Atividade A1 Análise de Algoritmos Iterativos e Notação Assintótica Data limite de entrega: 14 de outubro 1) Considerando o algoritmo abaixo e as operações primitivas estudadas em sala (atribuição, chamada de função, acesso ao elemento de um arranjo, operações aritméticas, retorno de função e comparação entre dois elementos). módulo Enigma ( inteiro A[], inteiro n ) início inteiro a, i; a = 0; para (i = n - 1; i >= 0; i--) faça se ((A[i] % 4 = 0) e (A[i] % 5 = 0)) então a = a + A[i]; fim-se fim-para retorna a; fim. Pede-se: a) O que faz o algoritmo enigma? Resposta: O algoritmo realiza a soma de todos os valores do conjunto A que são múltiplos de 4 e 5 ao mesmo tempo. b) Qual a configuração de A para o pior e melhor caso? Resposta: O melhor caso ocorre quando o comando condicional é falso, ou seja, quando não há elemento no conjunto A que seja múltiplo de 4 e/ou 5. O pior caso ocorre quando o comando condicional é verdadeiro (pois, executa o comando a = a + A[i]), ou seja, quando todos elementos no conjunto A são múltiplo de 4 e 5 ao mesmo tempo. c) Qual a T(n), em termos de operações primitivas, no melhor caso? Resposta: a = 0; para (i = n - 1; i >= 0; i--) faça se ((A[i] % 4 = 0) e (A[i] % 5 = 0)) então a = a + A[i]; fim-se fim-para retorna a; ----- 1 ----- 2 + ∑ 𝟏𝒏−𝟏𝒊= −𝟏 + ∑ 𝟖 𝒏−𝟏 𝒊= 𝟎 ----- 1 ---------------------------------- T(n) = 4 + n + 1 + 8n = 9n + 5 d) Qual a T(n), em termos de operações primitivas, no pior caso? Resposta: a = 0; para (i = n - 1; i >= 0; i--) faça se ((A[i] % 4 = 0) e (A[i] % 5 = 0)) então a = a + A[i]; fim-se fim-para retorna a; ----- 1 ----- 2 + ∑ 𝟏𝒏−𝟏𝒊= −𝟏 + ∑ 𝟏𝟏 𝒏−𝟏 𝒊= 𝟎 ----- 1 ---------------------------------- T(n) = 4 + n + 1 + 11n = 12n + 5 e) Qual o (Theta), no pior caso, por que (Prove pela definição de Tetha)? Resposta: Pela definição de Theta temos: Dada duas funções positivas f(n) e g(n), f(n) é (g(n)) se existem números positivos c1, c2 e n0 tais que c1g(n) f(n) c2g(n) para todo n n0. Logo, f(n) = 12n + 5 c1g(n) 12n + 5 c2g(n) para todo n n0. Fazendo g(n) = n. c1n 12n + 5 c2n para todo n n0. Fazendo c1 = 12 e c2= 13. 12n 12n + 5 13n para todo n 1, ou seja, n0 = 5. Portanto, f(n) é (n). 2) Dado o seguinte trecho de código, qual a expressão de k, em função de n ? k=0; for (i=2; i <= n; i++) for (j=n; j >= i; j--) k=k+1; Resposta: k = ∑ ∑ 𝟏𝒏𝒋=𝒊 𝒏 𝒊=𝟐 = ∑ (𝒏 − 𝒊 + 𝟏) 𝒏 𝒊=𝟐 = ∑ 𝒏 𝒏−𝟏 𝒊=𝟏 − ∑ (𝒊 𝒏−𝟏 𝒊=𝟏 + 𝟏) + ∑ 𝟏𝒏−𝟏𝒊=𝟏 k = 𝒏𝟐 − 𝒏 − 𝟏 𝟐 (𝒏 − 𝟏)𝒏 + 𝟐 (𝒏 − 𝟏) = 𝟏 𝟐 𝒏𝟐 + 𝟏 𝟐 𝒏 - 2= n(n + 1) /2 - 2 3) Considerando o módulo Enigma abaixo que: módulo Enigma ( inteiro A[], inteiro n ) início inteiro a, i; a ← 0; para (i ← n - 1; i >= 0; i--) faça se (A[i] % 2 == 0) então a ← a + A[i]; fim-se fim-para retorna a; fim. Pede-se: a) Qual a funcionalidade do módulo Enigma (o que ele faz)? Resposta: O módulo "realiza a soma de todos os valores do conjunto A que são pares" b) Qual a configuração de A para o pior e melhor caso? Resposta: O melhor caso ocorre quando o comando condicional é falso, ou seja, quando não há elemento par no conjunto A. O pior caso ocorre quando o comando condicional é verdadeiro (pois, executa o comando a = a + A[i]), ou seja, quando todos elementos no conjunto A são pares. c) Qual a T(n), em termos de operações primitivas, no pior caso? Resposta: a ← 0; para (i ← n - 1; i >= 0; i--) faça se ((A[i] % 2 == 0)) então a ← a + A[i]; fim-se fim-para retorna a; ----- 1 ----- 2 + ∑ 𝟏𝒏−𝟏𝒊= −𝟏 + ∑ 𝟕 𝒏−𝟏 𝒊= 𝟎 ----- 1 ---------------------------------- T(n) = 4 + n + 1 + 7n = 8n + 5 4) Um determinado algoritmo foi analisado, tendo por base as seis operações primitivas estudadas em aula, e foi obtido o T(n) na forma de um somatório abaixo. Pede-se: faça o seu cálculo e obtenha a função T(n) resultante. T(n) = ∑ ∑ 𝟏𝒏𝒋=𝒊 𝒏 𝒊=𝟏 Resposta: T(n) = ∑ ∑ 𝟏𝒏𝒋=𝒊 𝒏 𝒊=𝟏 = ∑ (𝒏 − 𝒊 + 𝟏) 𝒏 𝒊=𝟏 = ∑ 𝒏 𝒏 𝒊=𝟏 − ∑ 𝒊 𝒏 𝒊=𝟏 + ∑ 𝟏𝒏𝒊=𝟏 T(n) = 𝒏𝟐 − 𝟏 𝟐 𝒏(𝒏 + 𝟏) + 𝒏 = 𝟏 𝟐 𝒏𝟐 + 𝟏 𝟐 𝒏 = n(n + 1) /2 5) O trecho de algoritmo para calcular a nn que utiliza uma repetição para a contagem das multiplicações é dado por: Considerando todas as operações primitivas estudadas em sala, pede-se: a) Calcule a equação de complexidade T(n) para n_elevado_n( inteiro n ). Resposta: função inteiro n_elevado_n ( inteiro n) início inteiro res, i; res ← 1; -------------------------------------------- 1 + para (i ← 1; i ≤ n; i++) faça -------------------------------- 1 + (n+1) + n + res ← res * n; -------------------------------------- 2n + retorna res; ----------------------------------------------- 1 fim. ------------------------------------------------------------------------------------------------ T(n) = 4n + 4 operações. b) Calcule a equação de complexidade T(n) para n_elevado_n2( inteiro n ). Resposta: função inteiro n_elevado_n2( inteiro n) início inteiro res, i; res ← n ------------------------------------------- 1 + para (i ← 1; i < n; i= i *2) faça ----------------- 1 + theto( log2 n ) + (theto (log2 n ) - 1) * 2 função inteiro n_elevado_n ( inteiro n) início inteiro res, i; res ← 1; para (i ← 1; i ≤ n; i++) faça res ← res * n; retorna res; fim. Se n for um múltiplo de 2, como: 1, 2, 4, 8, 16, 32,... O algoritmo anterior que calcula nn pode ser reescrito para: função inteiro n_elevado_n2( inteiro n) início inteiro res, i; res ← n para (i ← 1; i < n; i= i *2) faça res ← res * res; retorna res; fim. res ← res * res; ----------------------------- (theto (log2 n ) - 1) * 2 retorna res; ------------------------------------------ 1 fim. ------------------------------------------------------------------------------------- T(n) = 5 * theto (log2 n) - 1 operações. c) Determine o O-grande dos dois algoritmos pela definição. Necessário determinar c e no. Resposta: A definição de O-Grande diz: Dada duas funções positivas f(n) e g(n), f(n) é O(g(n)) se existem números positivos c e n0 tais que f(n) cg(n) para todo n n0. Encontrando os O-Grandes: Algoritmo opção a) T (n) = 4n + 4 e fazendo g(n) = n Assim, 4n + 4 c n para todo n n0. fazendo c = 5 e no = 4 4n + 4 5 n para todo n 4, Portanto, T(n) = O(n) Algoritmo opção b) T (n) = 5 * theto (log2 n) - 1 e fazendo g(n) = log2 n Assim, 5 * theto (log2 n) - 1 c log2 n para todo n n0. fazendo c = 5 e no = 2 5 * theto (log2 n) - 1 5 log2 n para todo n 2. Portanto, T(n) = O(log2 n). 6) Considere os 5 algoritmos abaixo que determinam o enésimo termo da sequência de Fibonacci. a) Baseado nos estudos realizados em sala, apresente as complexidades (O-Grande) de cada um dos algoritmos.(Obs.: Não precisa calcular, basta apresentar o O-Grande) Resposta: fib_1 = O(n); fib_2 = O(lg n); fib_4 = O(n); b) Utilizando o algoritmo fib_4, determine a equação de complexidade (T(n)) considerando todas as operações primitivas. (Supor que a declaração "inteiro v[n+1]" contém 2 operações primitivas). Resposta: função inteiro fib_4( inteiro n ) início inteiro v[n+1], i = 1; ------------------------------------- 2 + 1 + v[0] = 0;------------------------------------- 2 + função inteiro fib_1( int n ) início se (n < 2) retorna n; senão início inteiro ant = 1, preant = 1, atual; para (inteiro i = 3; i <= n; i++) início atual = ant + preant; preant = ant; ant = atual; fim retorna atual; fim fim função inteiro fib_2(n) início inteiro a, b, c, d, i = n-1; se (n <= 0) retorna 0; (a, b) = (1, 0); (c, d) = (0, 1); enquanto (i > 0) faça início se (i mod 2 == 0) então (a, b) = (db + ca, d(b+a) + cd) (c,d) = (c2 + d2, d (2c + d)) i = i div 2; fim retorna a + b; fim. função inteiro fib_4( inteiro n ) início inteiro v[n+1], i = 1; v[0] = 0; v[1] = 1; enquanto (i < n) faça início v[i+1] = v[i] + v[i-1]; i = i + 1; fim retorna v[n]; fim. v[1] = 1; ------------------------------------ 2 + enquanto (i < n) faça ------------------------------------- 1 (para n = 0) e n (para n .> 0) + início v[i+1] = v[i] + v[i-1]; ------------------------------------- (n-1) * 7 + i = i + 1; ------------------------------------- (n-1) * 2 + fim retorna v[n]; ------------------------------------- 2 fim. __________________________________________________________ _________________ n = 0 => T(n) = 10 n > 0 => T(n) = 9 + n + 7 * (n-1) + 2 * (n-1) = 10n + 9 - 9 = 10n. 7) Suponha uma matriz Anxn na qual todos os elementos de cada linha estão ordenados em ordem crescente e os dois algoritmos abaixo procuram a existência de um elemento chave dentro das linhas da matriz. Ao encontrar o elemento chave na linha i insere em um vetor POS a posição (coluna) na qual o elemento chave foi encontrado dentro da i-ésima linha de A ou -1 se não achar. Pede-se: a) Calcular os tempos T(n) em termos SOMENTE do NÚMERO MÁXIMO DE COMPARAÇÕES NECESSÁRIAS (pior caso) para encontrar o elemento chave em cada linha da matriz A para: módulo inteiro [] alg_I(inteiro A[][], inteiro n, inteiro chave) início inteiro i, j, POS[]; logica achou; para (i 0; i < n; i ++) faça achou falso; para (j 0; ((j < n) e (não achou)); j ++) faça se (A[i][j] == chave) então POS[i] j; achou verdadeiro fim-para se (não achou) então POS[i] -1; fim-para retorna POS; fim módulo inteiro [] alg_II(inteiro A[][], inteiro n, inteiro chave) início inteiro i, f, l, m; lógica achou; para (i 0; i < n; i ++) faça f 0; l n-1; achou falso; enquanto((f <= l) e ( não achou)) faça m (f + l) div 2; se (chave == A[i][m]) então POS[i] m; achou verdadeiro; senão se (chave < A[i][m]) então l m-1; senão f m + 1; fim-enquanto se (não achou) então POS[i] -1; fim-para retorna POS; fim. b) Qual o O-grande de cada algoritmo. Mostre pela definição de O-grande encontrando uma constante c e n0 que os comprove. Sem a demonstração este item não será avaliado. a.1) alg_I; e b) a.2) alg_II; e b) módulo inteiro [] alg_I(inteiro A[][], inteiro n, inteiro chave) início inteiro i, j, POS[]; logica achou; para (i 0; i < n; i ++) faça achou falso; para (j 0; ((j < n) e (não achou)); j ++) faça se (A[i][j] == chave) então POS[i] j; achou verdadeiro fim-para se (não achou) então POS[i] -1; fim-para retorna POS; fim a) T(n) = n x n = n2 b) f(n) é O(g(n)) se c R+ e n0 Z+ tal que f(n) c g(n) , n n0 Então, seja g(n) = n2 n2 c n2, n n0 fazendo c = 1 e n0 = 0 n2 n2, n 0 portanto, T(n) = O(n2). c) Baseado no item “a” e “b”, a que conclusão pode-se chegar? Como a complexidade Talg_I(n) = O(n) > Talg_II(n) = O(n log2 n) pode-se chegar a conclusão que o Algoritmo II é mais eficiente que o Algoritmo I e seria mais indicado para resolver esse problema. 8) Considerando o algoritmo e as operações primitivas estudadas em sala (atribuição, chamada de função, acesso ao elemento de um arranjo, operações aritméticas, retorno de função e comparação entre dois elementos). função inteiro produto(inteiro n, inteiro m) início inteiro r; r 0; enquanto ( n 0) faça início se (n mod 2 0) então início r r + m; fim n n div 2; m m * 2; fim retorna r; fim módulo inteiro [] alg_II(inteiro A[][], inteiro n, inteiro chave) início inteiro i, f, l, m; lógica achou; para (i 0; i < n; i ++) faça f 0; l n-1; achou falso; enquanto((f <= l) e ( não achou)) faça m (f + l) div 2; se (chave == A[i][m]) então POS[i] m; achou verdadeiro; senão se (chave < A[i][m]) então l m-1; senão f m + 1; fim-enquanto se (não achou) então POS[i] -1; fim-para retorna POS; fim. a) T(n) = n x( ⌊log2 𝑛⌋ + 1) = 𝑛 ⌊log2 𝑛⌋ + 𝑛 b) f(n) é O(g(n)) se c R+ e n0 Z+ tal que f(n) c g(n) , n n0 Então, seja g(n) = 𝑛 log2 𝑛 𝑛 ⌊log2 𝑛⌋ + 𝑛 c 𝑛 log2 𝑛, n n0 fazendo c = 2 e n0 = 2 𝑛 ⌊log2 𝑛⌋ + 𝑛 2 𝑛 log2 𝑛, n 2 portanto, T(n) = O(𝑛 log2 𝑛). . Pede-se: a) Quais possíveis valores de n no pior caso e melhor caso? Pior caso: ocorre quando n é um valor ímpar e a divisão dos próximos valores continua ímpar. Melhor Caso: ocorre quando n é um valor par e a sua divisão por dois continua par. Vale comentar que, mesmo nesse caso, o condicional será verdadeiro quando n assume o valor 1. b) Qual a T(n), em termos de operações primitivas, no pior caso? n 1 3 7 15 Total de vezes 2 3 4 5 que repete n 0 Logo, a função que melhor representa as repetições de n 0 é ⌊log2 𝑛 + 1⌋ + 1 r 0; ----------------------------------------------------- 1 enquanto ( n 0) faça ------------------------------- ⌊log2 𝑛 + 1⌋ + 1 início se (n mod 2 0) então início r r + m; 8 * ⌊log2 𝑛 + 1⌋ fim n n div 2; m m * 2; fim retorna r; ------------------------------------------------ 1 Portanto, T(n) = 9 * ⌊log2 𝑛 + 1⌋ + 3 operações primitivas. c) Qual o (Theta), por quê? Resposta: Pela definição sabe-se que, dada duas funções positivas f(n) e g(n), f(n) é (g(n)) se existem números ositivos c1, c2 e n0 tais que c1g(n) f(n) c2g(n) para todo n n0. Então, fazendo g(n) = log2n, f(n) = t(n) c1 log2n 9 * ⌊log2 𝑛 + 1⌋ + 3 c2 log2 n, para todo n n0 Obtém-se c1 = 1, c2 = 15, para todo n 2. 9) (Análise de Algoritmos Iterativos - Baseada no ENADE) No cálculo da potência de n elevado a n ( nn ), onde n pertence a N, é possível elaborar diferentes algoritmos. Em particular, pode-se pensar em soluções algorítmicas que calculam a potência para valores de n múltiplos de 2, tais como: 1, 2, 4, 8, 16, 32,... Duas soluções algorítmicas que calculam a potência para valores de n múltiplos de 2 são apresentados a seguir. Algoritmo 1: função inteiro n_elevado_n ( inteiro n ) início inteiro res, i; res ← 1; para (i ← 1; i ≤ n; i++) façares ← res * n; retorna res; fim. Algoritmo 2: função inteiro n_elevado_n2( inteiro n ) início inteiro res, i; res ← n para (i ← 1; i < n; i= i * 2) faça res ← res * res; retorna res; fim. Com base nos algoritmos 1 e 2, avalie as asserções a seguir e a relação proposta entre elas. I - O Algoritmo 1 é mais eficiente que o Algoritmo 2 em termos do tempo de execução. PORQUÊ II - A complexidade assintótica do Algoritmo 1 é O(n log n) e do Algoritmo 2 é O( n ). A respeito dessas asserções, assinale a alternativa correta. A) As asserções I e II são proposições verdadeiras, e a II é justificativa correta da I. B) As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I. C) A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. D) A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. E) As asserções I e II são proposições falsas. Resposta: A alternativa correta é a “E”, pois a complexidade assintótica (pior caso) do Algoritmo 1 = O(n) e Algoritmo 2 = O(log n) , o que indica que o Algoritmo 2 é mais eficiente que o Algoritmo 1 em termos do tempo de execução. 10) Um algoritmo de complexidade 8 * log2 n. Num certo computador, num tempo t, o algoritmo resolve um problema de tamanho 16 dados. Imagine agora que você tem disponível um computador 2 vezes mais rápido. Qual o tamanho máximo de problema que o mesmo algoritmo resolve no mesmo tempo t no computador mais rápido. Resposta: 8 log2 16 ------ t 8 log2 n ------ 2 t 8 log2 n x t = 2 t x 8 log2 16 log2 n = 2 x log2 16 log2 n = 2 x 4 2 8 = n n = 256 dados Resposta: O novo tamanho do problema é 256 dados 11) Um certo professor criou um programa para levantar estatísticas sobre o desempenho de seus alunos. A eficiência do programa é medida pelo número de comparações feitas no processamento e é expressa pela função A(n) = n² + 500 – lg lg n, onde n é o número de alunos da turma. A direção da escola aprovou o uso do programa e resolveu aplicá-lo para todos os alunos. Outro professor gostou da ideia e resolveu criar o seu próprio programa com eficiência medida por B(n) = 60n - lg lg n. Agora é necessário saber qual dos dois programas será utilizado. De modo a auxiliar a direção da escola na tomada de decisão, calcule e determine qual valor de n N a função A(n) é mais eficiente que B(n): Justificativa: Sejam as duas funções de eficiência dos programas A(n) =n2 + 500 - lg lg n e B(n) = 60n - lg lg n. Para que A(n) seja mais eficiente que B(n), A(n) < B(n). Montando a inequação: n2 + 500 - lg lg n < 60n - lg lg n n2 -60n + 500 < 0 Para encontrar a solução, deve-se resolver a equação do 2o grau correspondente: A resolução da equação do 2o grau "an2 + bn + c = 0" é dada pela fórmula: n = (-b +/- raiz (delta)) / 2 * a, onde delta = b * b - 4 * a * c. Como a = 1, b = -60, c = 500, o delta é: delta = 3600 - 4 x 500 = 1600. Então, raiz ( delta ) = 40. Assim, n = (60 +/- 40) / 2 n1 = 50 n2 = 10 Analisando os valores da raiz pela inequação encontra-se a resposta: 10 < n < 50, n N. 12) Um algoritmo é executado em 5 segundos para uma entrada de tamanho 100. Se o algoritmo tem tempo de execução dado por T(n)=K n log n, quanto tempo em segundos, aproximadamente, ele levará, no mesmo computador, para uma entrada de tamanho 1000? Resposta: Basta resolver a correspondência: K 100* log 100 ==> 5s K 1000 * log 1000 ==> x Logo x=((K*1000*log 1000)*5)/(K*100*log 100)= 1000*3*5/100*2 = 75 s 13) Dois algoritmos A e B tem a função de complexidade de tempo A(n) =n2 + 500 + lg n e B(n) = 60n + lg n. Pergunta-se: Para quais n N, A(n) é mais eficiente que B(n)? Resposta: A(n) =n2 + 500 + lg n e B(n) = 60n + lg n. A(n) < B(n) n2 + 500 + lg n < 60n + lg n n2 -60n + 500 < 0 d = 3600 - 4 x 500 = 1600 = 40 n = (60 +/- 40) / 2 n1 = 50 n2 = 10 resposta : 10 < n < 50, n N. 14) Um algoritmo de complexidade 4* lg n. Num certo computador, num tempo t, o algoritmo resolve um problema de tamanho 32. Imagine agora que você tem disponível um computador 2 vezes mais rápido. Qual o tamanho máximo do problema que o mesmo algoritmo resolve no mesmo tempo t no computador mais rápido. Resposta: 4 lg 32 ------ t 4 lg n ------ 2 t 4 lg n t = 4 lg 32 x 2 t lg n = lg 32 x 2 lg n = 5 x 2 2 10 = n n = 1024 dados 15) Dois algoritmos A e B com complexidade A(n) =n2 + 500 - lg lg n e B(n) = 60n - lg lg n. Pergunta-se: Para quais n N, A(n) é mais eficiente que B(n)? Resposta: A(n) =n2 + 500 - lg lg n e B(n) = 60n - lg lg n. A(n) < B(n) n2 + 500 - lg lg n < 60n - lg lg n n2 -60n + 500 < 0 d = 3600 - 4 x 500 = 1600 = 40 n = (60 +/- 40) / 2 n1 = 50 n2 = 10 resposta : 10 < n < 50, n N. 16) (Baseada nas questões do POSCOMP 2002 e 2004). Com base nos estudos sobre Notação Assintótica, determine quais das seguintes igualdades ou afirmações são verdadeiras. I. A propriedade transitividade é válida somente para as notações 𝚯, 𝐎 𝐞 𝛀, mas não são válidas para as notações o e 𝛚. II. f(n) = O(g(n)) se e somente se g(n) = 𝛚 (f(n)) III. 𝐥𝐨𝐠𝟏𝟎 𝒏 + 𝒏 = 𝛀(𝐥𝐨𝐠𝟏𝟎 𝒏) IV. 𝟐𝒏+𝟑 = 𝐎(𝟐𝒏) V. √𝒏𝟑 + 𝐥𝐨𝐠𝟏𝟎 𝒏 = 𝚶(𝒏) A) somente II e IV B) somente I e III C) somente I e IV D) somente I, II e V E) somente III e IV Alternativa: E. Justificativa: I - Falsa, pois a propriedade de transitividade é válida para todas as notações assintóticas, conforme abaixo: f(n) = O(g(n)) e g(n) = O(h(n)) implicam f(n) = O(h(n)) f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n)) f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n)) f(n) = o(g(n)) e g(n) = o(h(n)) implicam f(n) = o(h(n)) f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n)). II - Falsa, pois a propriedade "Simetria de Transposição" descreve que "f(n) = O(g(n)) se e somente se g(n) = (f(n))". III - Verdadeira, pois a notação assintótica Ω é um limitante inferior e log10 𝑛 + 𝑛 >= log10 𝑛. IV - Verdadeira, pois pela definição de O podemos encontrar g(n) = 2n. Para isso, basta fazer 8 ∗ 2𝑛 >= 2𝑛+3, 𝑝𝑎𝑟𝑎 𝑛 >= 1. V - Falsa, como √𝑛3 + log10 𝑛 >= 𝑛, 𝑛 não é um limitante superior para √𝑛3 + log10 𝑛, portanto √𝑛3 + log10 𝑛 = Ω(𝑛). 17) Escrever se as afirmações abaixo são verdadeiras ou falsas? Explicar o porquê em cada caso. a) log2 𝑛 + √𝑛 = O(log2 𝑛) Falso, pois √𝑛 é limitante superior a log2 𝑛. Assim, log2 𝑛 + √𝑛 = O(√𝑛). b) 3𝑛+2 = Θ(3𝑛) Verdadeiro, pois 3𝑛+2 = 323𝑛 = 9 3𝑛. Pela definição de Theta. c1 3𝑛 ≤ 9 3𝑛 ≤ c2 3𝑛, n >= n0, fazendo c1 = c2 = 9 e n0 = 0. c) 1000n2 + n log2 𝑛 2 = Ω(𝑛2) Verdadeiro, pois um limitante inferior da função 1000 𝑛2 + 2 n log2 𝑛 pode ser 𝑛 2 d) f(n) = (g(n)) se e somente se g(n) = O(f(n)) Falso, pois g(n) = n e g(n) = n, então n é O (n), mas f(n) = n não é (g(n) = n). e) n3 + n3 log2 n2 = o(n4) Verdadeiro, pois f(n) = n3 + n3 log2 n2 = n3 + 2 n3 log2 n é o(n4), ou seja lim 𝑛→ ∞ 𝑛3+2 𝑛3 log2 𝑛 𝑛4 = 0. 18) Quais das seguintes igualdades ou afirmações NÃO são verdadeiras? Explicar o por que em cada caso. I. A propriedade transitividade é válida somente para as notações Θ, O e Ω, mas não são válidas para as notações o e ω. FALSA. Segundo as propriedades estudadas, transitividade é aplicada a todas notações assintóticas, ou seja, f(n) = O(g(n)) e g(n) = O(h(n)) implicam f(n) = O(h(n)) f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n)) f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n)) f(n) = o(g(n)) e g(n) = o(h(n)) implicam f(n) = o(h(n)) f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n)) II. f(n) = O(g(n)) se e somente se g(n) = ω (f(n)) FALSA. Segundo apropriedade Simetria da Transposição, f(n) = O(g(n)) se e somente se g(n) = (f(n)). III. log10 𝑛 + 𝑛 = Ω(log10 𝑛) VERDADEIRO. Pela definição: Dada duas funções positivas f(n) e g(n), f(n) é (g(n)) se existem números positivos c e n0 tais que f(n) cg(n) para todo n n0. Assim, log10 𝑛 + 𝑛 c log10 𝑛 para todo n n0 Fazendo c = 1 e n0 = 1 log10 𝑛 + 𝑛 log10 𝑛 para todo n 1 Portanto, log10 𝑛 + 𝑛 = Ω(log10 𝑛) IV. 2𝑛+3 = O(2𝑛) VERDADEIRO. Pela definição: Dada duas funções positivas f(n) e g(n), f(n) é O(g(n)) se existem números positivos c e n0 tais que f(n) cg(n) para todo n n0. Assim, 2𝑛+3 c 2𝑛 para todo n n0 Fazendo c = 8 e n0 = 0 2𝑛+3 8 2𝑛 para todo n 0 Portanto, 2𝑛+3 = O(2𝑛) V. √𝑛3 + log10 𝑛 = Ο(𝑛) FALSA. Pelas propriedades de O-grande 𝑛 3 2 + log10 𝑛 = O(𝑛 3 2) Portanto, √𝑛3 + log10 𝑛 𝑑𝑖𝑓𝑒𝑟𝑒𝑛𝑡𝑒 𝑑𝑒 Ο(𝑛) 19) (Baseada em questão do POSCOMP 2016). Um algoritmo que trabalha com uma matriz A contendo n linha e m colunas tem complexidade O(100m4 + 10m2n2 + 200mn2 + 800n2 + 90m2 ). Considerando as propriedades do O- Grande, apresente uma maneira simplificada de expressar a complexidade desse algoritmo. A) O(m4 ). B) O(m2 ). C) O(m4 + m2n2 ). D) O(m2n2 ). E) O(m4+ n2 ). Resposta: Aplicando-se as propriedades de O-Grande, esta complexidade pode ser simplificada para: O(m4 + m2n2 ). Alternativa C. 20) Sabendo-se que a função de complexidade obtida para um algoritmo no pior caso foi T(n) = 12n + 4. Determine o (Theta) pela definição, ou seja, encontre c1, c2, n0 e a g(n). Resposta: A definição de Theta descreve: Dada duas funções positivas f(n) e g(n), f(n) é (g(n)) se existem números positivos c1, c2 e n0 tais que c1g(n) f(n) c2g(n) para todo n n0. Logo, devemos encontrar g(n), c1, c2 e n0 tais que c1g(n) f(n) c2g(n) para todo n n0. c1g(n) 12n + 4 c2g(n) para todo n n0. Considerando g(n) = n. c1 n 12n + 4 c2 n para todo n n0. Fazendo c1 = 1 e c2 = 16, n0 = 1, a expressão é validada para todo n 1. Portanto, f(n) = 12n + 4 é (n). 21) Qual o (n) para t(n) = n2 - n - 2 ? Mostre pela definição de , encontrando as constantes, c1, c2 e n0. Resposta: Definição para (n): Dada duas funções positivas f(n) e g(n), f(n) é (g(n)) se existem números positivos c1, c2 ( > 0 e R+) e n0 tais que c1g(n) f(n) c2g(n) para todo n n0 (n0 0 e Z+). para t(n) = n2 - n - 2 Supondo g(n) = n2 c1 n2 <= n2 - n - 2 <= c2 n2, n >= n0 0,5 n2 <= n2 - n - 2 <= 2 n2, n >= 4 encontramos c1 = 0,5, c2 = 2, n0 = 4. 22) Considere T(n) = T(n) = 8n - 8, encontre o O-Grande para a função T(n) pela definição?. Resposta: Duas funções positivas f(n) e g(n), f(n) é O(g(n)) se existem duas constantes positivas c e n0 tal que f(n) <= c g(n), n >= n0 Então, considerando g(n) = n 8n-8 <= c n, n >=n0, fazendo c = 8 e n0 = 0, temos 8n-8<= 8n, n>=0, portanto, T(n) é O(n). 23) Sejam as funções f(n) = (lg n)3 + n e g(n) = n + n2 lg n. Compará-las e dizer se f(n) = O(g(n)), f(n)=Ω(g(n)) e/ou f(n) = Θ(g(n)), f(n) = o(g(n)) ou f(n) = (g(n)). Resposta: Sejam as funções f(n) = (lg n)3 + n e g(n) = n + n2 lg n. Compará-las e dizer se f(n) = O(g(n)), f(n)=Ω(g(n)) e/ou f(n) = Θ(g(n)), f(n) = o(g(n)) ou f(n) = (g(n)). (0.2) (Demonstre\explique sua solução, sem ela o exercício não será avaliado). Pelas propriedades 3, 4, 6, 7, 10 de O-Grande obtemos que: f(n) = (lg n)3 + n é O(n) g(n) = n + n2 lg n é O(n2 lg n) fazendo lim 𝑛→∞ 𝑓(𝑛) 𝑔(𝑛) = 0 portanto f(n) é o(g(n) e, como g(n) é um limitante superior para f(n) satisfaz a definição de O-grande, portanto: f(n) é O(g(n)). 24) Sejam as funções f(n) = (lg n)3 + n2 lg n e g(n) = n2 + n lg n. Compará-las e dizer se f(n) = O(g(n)), f(n)=Ω(g(n)) e/ou f(n) = Θ(g(n)), f(n) = o(g(n)) ou f(n) = (g(n)). Resposta: Sejam as funções f(n) = (lg n)3 + n2 lg n e g(n) = n2 + n lg n Compará-las e dizer se f(n) = O(g(n)), f(n)=Ω(g(n)) e/ou f(n) = Θ(g(n)), f(n) = o(g(n)) ou f(n) = (g(n)). (0.2) (Demonstre\explique sua solução, sem ela o exercício não será avaliado). Pelas propriedades 3, 4, 6, 7, 10 de O-Grande obtemos que: f(n) é O(n2 lg n) g(n) é O(n2) fazendo lim 𝑛→∞ 𝑓(𝑛) 𝑔(𝑛) = lim 𝑛→∞ 𝑙𝑔 𝑛 = portanto f(n) é ω(g(n) e, como g(n) é um limitante inferior para f(n) também satisfaz a definição de Ω, portanto: f(n) é Ω (g(n)).
Compartilhar