Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Estrutura de Dados e Algoritmos 1 Complexidade e Notação Assintótica Prof. Cláudio Campelo, PhD Departamento de Sistemas & Computação / UFCG Recapitulando… 2 É importante não só ter uma máquina boa, mas também um algoritmo (tecnologia) eficiente! É importante não só ter uma máquina boa, mas também um algoritmo (tecnologia) eficiente! 2 Perguntas pertinentes 3 � Como representar e estudar o tempo de execução dos algoritmos? � Como classificar os diversos algoritmos de acordo com seus tempos de execução? � O quão eficiente é um algoritmo? Pontos a considerar 4 � Intruções sequenciais � Uso de abstração (identificar termos mais significantes nas fórmulas) � Uso de background matemático � Tamanho da entrada depende do problema 3 Pontos a considerar 5 � Tempo de execução = número de passos executados � Cada linha é executada em um tempo constante � O número de repetições de cada linha é que será relevante na complexidade!!! Pontos a considerar (Exemplo) 6 Custo Quantidade Executada Algoritmo com aninhamento de laços 4 Caso a Considerar 7 � Pior Caso � É um limite superior do tempo de execução de um algoritmo � Ocorre frequentemente � O caso médio é frequentemente tão ruim quanto o pior caso Classes de Função 8 � O tempo de execução é uma função da entrada � Cada função tem uma taxa de crescimento � Uso de agrupamento de funções. Funções de mesmo grupo tem taxa de crescimento equivalentes 5 Classes de Função 9 polinomial (quadrática, cúbica,...) linear constante logarítmica exponencial Cada classe é caracterizada por uma família diferente de curva Classes de Função 10 6 Exercício 11 � Ordene as funções por ordem de crescimento � n5+132n2 � 3n+12 � 8900 � 45log(n) � 45log(n).n � 132n2 Exercício 12 � Suponha que temos dois algoritmos que ordenam elementos. � O Alg 1 pertence a classe n2 � O Alg 2 pertence a classe n.log n. � Qual dos dois você escolheria? 7 Cálculo do tempo: Idéia Principal 13 � Ignore constantes relacionadas ao hardware � Foco � Crescimento da função quando n → infinito � Análise Assintótica O tempo de execução cresce proporcionalmente a n (polinomialmente, exponencialmente, logaritmicamente, etc.) Análise Assintótica 14 � É uma ferramenta para ajudar a estruturar nosso pensamento � Eficiência assintótica: entradas grandes para tornar relevante apenas a ordem de crescimento do tempo de execução 8 Notação Assintótica 15 � Descreve o tempo de execução assintótica de um algoritmo Notação Θ 16 � Intuição Θ(g(n)) = {f(n) | ∃c1>0, c2>0, n0>0, 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) ∀n ≥ n0} n T(n) c2g(n) f(n) c1g(n) n0 g(n) é um limite assintoticamente restrito para f(n) função assintoticamente não negativa Θ considera função de mesma classe de complexidade, pois estabelece limites superiores e inferiores. 9 Notação Θ 17 � Intuição Θ(g(n)) = {f(n) | ∃c1>0, c2>0, n0>0, 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) ∀n ≥ n0} n T(n) c2g(n) f(n) c1g(n) n0 g(n) é um limite assintoticamente restrito para f(n) - Se f(n) ∈ Θ(g(n)) então dizemos que f(n) cresce tão rapidamente quanto g(n) ! - g(n) é um limitante assintótico justo (apertado) para f(n) Notação Θ 18 � Intuição Θ(g(n)) = {f(n) | ∃c1>0, c2>0, n0>0, 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) ∀n ≥ n0} n T(n) c2g(n) f(n) c1g(n) n0 g(n) é um limite assintoticamente restrito para f(n) 10 Exemplo 19 � f(n) = 7n4+5n2+10 e g(n) = n4 � c1 = 7 > 0 � c2 = 22 > 0 � 0 ≤ 7n4 ≤ 7n4+5n2+10 ≤ 22n4 � Logo, concluímos que: � 7n4+5n2+10 ∈ Θ(n4) Θ(g(n)) = {f(n) | ∃ c1>0, c2>0, n0>0, 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) ∀n ≥ n0} c1g(n) c2g(n)f(n) Lidando com a Notação Θ 20 � Remova os termos de ordem mais baixa � Ignore as constantes da ordem mais alta Exemplo: � 7n4+5n2+890 ∈ Θ(n4) remova ignore 11 Exercício 1 21 � Qual o Θ das funções abaixo? � 8 � 5n2+8 � 7n7+5n2+8 � 7n.logn + 5n Exercício 2 22 � Indique pelo menos 5 funções que ∈ Θ(n3). 12 Exercício 3 23 � Justifique: � 5n2+8n ∈ Θ(n) ? � 7n7+5n2+8 ∈ Θ(n7) ? � 7log n ∈ Θ(n) ? Recapitulando 24 � Algoritmo do cálculo de potência de 2 long potencia(int n) { long r = 1; for (int i=1; i<=n; i++) r=2*r; return r; } 13 Recapitulando 25 � Algoritmo do cálculo de potência de 2 long potencia(int n) { c1 + for (int i=1; i<=n; i++) r=2*r; return r; } Recapitulando 26 � Algoritmo do cálculo de potência de 2 long potencia(int n) { c1 + for (c1 + i<=n; i++) r=2*r; return r; } 14 Recapitulando 27 � Algoritmo do cálculo de potência de 2 long potencia(int n) { c1 + for (c1 + n*c2 + i++) r=2*r; return r; } Recapitulando 28 � Algoritmo do cálculo de potência de 2 long potencia(int n) { c1 + for (c1 + n*c2 + c3*(n-1)+) r=2*r; return r; } 15 Recapitulando 29 � Algoritmo do cálculo de potência de 2 long potencia(int n) { c1 + for (c1 + n*c2 + c3*(n-1)+) n*c4 + return r; } Recapitulando 30 � Algoritmo do cálculo de potência de 2 long potencia(int n) { c1 + for (c1 + n*c2 + c3*(n-1)+) n*c4 + c5 } 16 Recapitulando 31 � Algoritmo do cálculo de potência de 2 f(n) = n f(n) = Θ(n) simplificando... Complexidade do algoritmo long potencia(int n) { c1 + for (c1 + n*c2 + c3*(n-1)+) n*c4 + c5 } f(n) = 2*c1 + c2*(n+1) + n*c3 + n*c4 + c5 Exercício 4 32 � Qual a complexidade Θ do algoritmo abaixo? public static int soma(int[] A) { int soma = 0; for(int i=0;i<A.length;i++) soma+=A[i] return soma; } 17 Exercício 4 33 � Qual a complexidade Θ do algoritmo abaixo? public static int soma(int[] A) { int soma = 0; for(int i=0;i<A.length;i++) soma+=A[i] return soma; } c c n*c Exercício 4 34 � Qual a complexidade Θ do algoritmo abaixo? public static int soma(int[] A) { int soma = 0; for(int i=0;i<A.length;i++) soma+=A[i] return soma; } f(n) = n f(n) = Θ(n) c c n*c 18 Notação Assintótica em Equações 35 � Abusos da notação matemática que podem facilitar o entendimento em alguns casos n2+2n = Θ(n2) ∈ Conjunto de funções n2+2n = Θ(n2)+n função anônima, significando qualquer função em Θ(n2) Exercício 1 36 � Seja T(n) = n2 + Θ(n). T(n) pertence a que Θ? 19 Exercício 2 37 � A afirmação n = Θ(2n+5) é verdadeira? Justifique. Exercício 3 38 � Qual a interpretação de Θ(n)+Θ(n)=Θ(n)? � Θ(n)+Θ(n) = Θ(n) é verdade? Justifique. 20 Exercício 4 39 � A afirmação Θ(n) = Θ(n2) é verdadeira ou falsa? Notação O (upper bounds) 40 � Intuição O(g(n)) = {f(n) | ∃c>0, n0>0, 0 ≤ f(n) ≤ c g(n) ∀n ≥ n0} n T(n) c . g(n) f(n) n0 g(n) é um limite assintótico superior para f(n) - Se f(n) ∈ O(g(n)) então dizemos que f(n) cresce no máximo tão rapidamente quanto g(n) ! - g(n) é um limitante superior assintótico para f(n) 21 Notação O (upper bounds) 41 � Intuição O(g(n)) = {f(n) | ∃c>0, n0>0, 0 ≤ f(n) ≤ c g(n) ∀n ≥ n0} n T(n) c . g(n) f(n) n0 g(n) é um limite assintótico superior para f(n) Intuição do Big-O 42 0 20 40 60 80 100 120 140 1 2 3 4 5 tamanho da entrada T(n ) n0 f(n) = n2+10 5.g(n) = 5.n2 0 ≤ n2+10 ≤ 5.n2 , para n ≥ n0 f(n) é O(n2) 22 Exemplo 43 � Comparar f(n) = 7n4+5n2+10 com g(n) = n4 � 0 ≤ 7n4+5n2+10 ≤ 22n4, c = 22 > 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ O(n4) � f(n) = 7n4+5n2+10 com g(n) = n5 � 0 ≤ 7n4+5n2+10 ≤ 22n5, c = 22> 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ O(n5) O(g(n)) = {f(n) | ∃c>0, n0>0, 0 ≤ f(n) ≤ c g(n) ∀ n ≥ n0} Exercício 1 44 � Qual o O das funções abaixo? � 890 � 5n2+890 � 7n7+5n2+890 � 7nlogn+5n 23 Exercício 2 45 � Indique pelo menos 5 funções que ∈ O(n3). Exercício 3 46 � log2n ∈ O(n)? � log2n ∈ Θ(n)? � n2 ∈ O(2n)? � n2 ∈ Θ(2n)? � 3n+1 ∈ O(5n+10)? � 3n+1 ∈ Θ(5n+10)? 24 Exercício 4 47 � Qual a complexidade O do algoritmo abaixo? public static int soma(int[] A) { int soma = 0; for(int i=0;i<A.length;i++) soma+=A[i] return soma; } Exercício 4 48 � Qual a complexidade O do algoritmo abaixo? f(n) = n f(n) = O(n) f(n) = O(n2) f(n) = O(n3) ... public static int soma(int[] A) { int soma = 0; for(int i=0;i<A.length;i++) soma+=A[i] return soma; } c c n*c 25 Exercício 5 49 � Qual a complexidade O dos algoritmos ao lado no pior caso? � Vocês conhecem algum algoritmo assintoticamente mais eficiente? boolean primo(int n) { if (n==2) return true; for (int i=2; i<n; i++) if (n%i==0) return false; return true; } boolean primo(int n) { if (n==2) return true; for (int i=2; i<=n/2; i++) if (n%i==0) return false; return true; } Notação Ω (lower bounds) 50 � Intuição Ω(g(n)) = {f(n) | ∃c>0, n0>0, 0 ≤ cg(n) ≤ f(n) ∀n ≥ n0} n T(n) f(n) c g(n) n0 g(n) é um limite assintótico inferior para f(n) - Se f(n) ∈ Ω(g(n)) então dizemos que f(n) cresce no mínimo tão lentamente quanto g(n) ! - g(n) é um limitante inferior assintótico para f(n) 26 Notação Ω (lower bounds) 51 � Intuição Ω(g(n)) = {f(n) | ∃c>0, n0>0, 0 ≤ cg(n) ≤ f(n) ∀n ≥ n0} n T(n) f(n) c g(n) n0 g(n) é um limite assintótico inferior para f(n) Exemplo 52 � f(n) = 7n4+5n2+10 e g(n) = n4 � 0 ≤ 7n4 ≤ 7n4+5n2+10, c = 7 > 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ Ω(n4) � f(n) = 7n4+5n2+10 e g(n) = n � 0 ≤ 7n ≤ 7n4+5n2+10, c = 7 > 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ Ω(n) Ω(g(n)) = {f(n) | ∃c>0, n0>0, 0 ≤ cg(n) ≤ f(n) ∀n ≥ n0} 27 Exercício 1 53 � Qual o ordem Ω das funções abaixo? � 890 � 5n2+890 � 7n5+5n2+890 � 7nlogn+5n Exercício 2 54 � Indique pelo menos 5 funções que ∈ Ω(n3). 28 Exercício 3 55 � log n ∈ Ω(n)? � log n ∈ Θ(n)? � log n ∈ O(n)? � n2 ∈ Ω(2n)? � n2 ∈ Θ(2n)? � n2 ∈ O(2n)? 56 � ( ) Sobre o gráfico acima, f(n) = O(h(n)) e i(n) = Ω(h(n)). � ( ) Sobre o gráfico acima, g(n) = O(i(n)), i(n) = O(f(n)) e, portanto, g(n) = O(f(n)). g(n) h(n) f(n) i(n) V ou F ? 29 Notação o 57 � Intuição o(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ f(n) < c g(n) para todo n ≥ n0} n T(n) c . g(n) f(n) n0 g(n) é um limite superior que não é assintoticamente restrito para f(n) - Se f(n) ∈ o(g(n)) então dizemos que f(n) cresce mais lentamente que o(g(n)! Notação o 58 � Intuição o(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ f(n) < c g(n) para todo n ≥ n0} n T(n) c . g(n) f(n) n0 g(n) é um limite superior que não é assintoticamente restrito para f(n) 30 Exemplo 59 � f(n) = 7n4+5n2+10 e g(n) = n5 � 0 ≤ 7n4+5n2+10 < cn5, c > 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ o(n5) � f(n) = 7n4+5n2+10 e g(n) = n6 � 0 ≤ 7n4+5n2+10 < cn6, c > 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ o(n6) o(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ f(n) < c g(n) para todo n ≥ n0} Exercício 1 60 � Qual o o das funções abaixo? � 890 � 5n2+890 � 7n7+5n2+890 � 7nlogn+5n 31 Exercício 2 61 � Indique pelo menos 5 funções que ∈ o(n3). Exercício 3 62 � log2n ∈ o(n)? � log2n ∈ O(n)? 32 Notação ω 63 � Intuição ω(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ cg(n) < f(n) para todo n ≥ n0} n T(n) f(n) c g(n) n0 g(n) é um limite inferior que não é assintoticamente restrito para f(n) - Se f(n) ∈ ω(g(n)) então dizemos que f(n) cresce mais rapidamente que g(n)! Notação ω 64 � Intuição ω(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ cg(n) < f(n) para todo n ≥ n0} n T(n) f(n) c g(n) n0 g(n) é um limite inferior que não é assintoticamente restrito para f(n) 33 Exemplo 65 � f(n) = 7n4+5n2+10 e g(n) = n3 � 0 ≤ cn3 < 7n4+5n2+10, c > 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ ω(n3) � f(n) = 7n4+5n2+10 e g(n) = n � 0 ≤ cn ≤ 7n4+5n2+10, c > 0 � Logo, concluímos que: � 7n4+5n2+10 ∈ ω(n) ω(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ cg(n) < f(n) para todo n ≥ n0} Exercício 1 66 � Qual o ω das funções abaixo? � 5n2+890 � 7n5+5n2+890 � 7nlogn+5n 34 Exercício 2 67 � Indique pelo menos 5 funções que ∈ ω(n3). Exercício 3 68 � log2n ∈ ω(n)? � log2n ∈ Ω(n)? 35 Relação entre Notações 69 Θ (g(n)) = O(g(n)) ∩ Ω(g(n)) Upper bound Lower bound Tight bound ou Recapitulando 70 n T(n) f(n) c g(n) n0 n T(n) c . g(n) f(n) n0 n T(n) c2g(n) f(n) c1g(n) n0 Θ Ω O 36 Propriedades das Classes de Funções 71 Definições Equivalentes 72 37 Trabalhando com limites 73 Exercício 1 74 Θ O o Ω ω 5n2+8 7n4+5n2 +8 7nlogn+5n 38 Exercício 3 75 � Faça a análise do algoritmo a seguir. public int fatorial(int n) { int fat = 1; for (int i = 1; i <= n; i++) fat = fat * i; return fat; } Exercício 4 76 � Os algoritmos fazem a mesma coisa? � Qual deles é mais eficiente? Por que? float [] result = new float[x.length]; for(int i=0;i<x.length; i++) { float a=0; for(int j=0;j<=i;j++) a = a + x[j]; result[i] = (a)/(i+1); } return result; float [] result = new float[x.length]; float s=0; for(int i=0;i<x.length; i++) { s = s + x[i]; result[i] = s/(i+1); } return result;
Compartilhar