Comportamento Assintótico de Funções

Livre

0
0
45
1 year ago
Preview
Full text

  Comportamento Assintótico de Funções

  

Algoritmos e Estruturas de Dados I

nataliabatista@decom.cefetmg.br https://sites.google.com/site/nataliacefetmg/ Natália Batista

  

  Custo de utilização de um algoritmo:

   depende do tamanho n do problema o parâmetro n fornece uma medida da dificuldade para se resolver o problema o tempo necessário cresce quando n cresce

  

  Para valores suficientemente pequenos de n, qualquer algoritmo custa pouco para ser executado, mesmo os ineficientes.

  A escolha do algoritmo não é um problema crítico para problemas de tamanho pequeno.

  Logo, a análise de algoritmos é realizada para valores grandes de n.

  

  Qual é o comportamento das funções de custo para valores grandes de n? Comportamento assintótico de f(n): representa o limite do comportamento do custo quando n cresce.

  

  A análise de um algoritmo geralmente conta com apenas algumas operações elementares.

  A medida de custo ou medida de complexidade relata o crescimento assintótico da operação considerada.

   Definição: Uma função f(n) domina assintoticamente outra função g(n) se

  existem duas constantes positivas c e m tais que, para n  m, temos |g(n)|  c x |f(n)|.

   Dominação assintótica de f(n) sobre g(n). m

  (Ziviani)

  2 1. Sejam g(n) = n e f(n)= -n . 2 Temos que |n|  |-n | para todo n pertencente ao conjunto dos números naturais. Podemos escolher c=1 e m=0. Logo, f(n) domina assintoticamente g(n).

  Observe que g(n) não domina assintoticamente 2

f(n) porque |-n | > c|n| para todo n>c e n>1,

qualquer que seja o valor de c.

  2 e f(n)= n

  2 . As funções g(n) e f(n) dominam assintoticamente uma à outra:

  |(n+1) 2 |  4|n 2 | para n  1 e c = 4 |n 2 |  |(n+1) 2 | para n  0 e c = 1

  

  Existem três notações principais na análise assintótica de funções: Notação O (“O” grande) Notação  (omega) Notação � (theta)

  

  Para expressar que f(n) domina assintoticamente g(n) escrevemos: g(n) = O( f(n) ) Lê-se: g(n) é da ordem no máximo f(n).

  

  Exemplo: se o tempo de execução de um 2 programa T(n) é O(n ), significa que existem constantes c e m tais que, para valores de n maiores ou iguais a m,

  2 T(n)  cn .

  

  Definição: Uma função f(n) é O(g(n)) se existem duas constantes positivas c e m tais que, para todo n  m, f(n)  c g(n). m

  

  As funções de complexidade de tempo são definidas sobre os inteiros não negativos.

  A notação O define um limite superior para a função, por um fator constante.

  Pode-se dizer que g(n) é um limite

  assintótico superior (em inglês, asymptotic upper bound ) para f(n).

  

  Exercício 1: Seja g(n) = (n+1) 2 . Prove que g(n) é O(n 2 ).

  

  Exercício 1: Seja g(n) = (n+1) 2 . Prove que g(n) é O(n 2 ).

  Faça m=1 e c=4. Logo (n+1) 2 ≤ 4n 2 para n ≥ 1.

  

  Exercício 2: Prove que g(n) = 3n 3 +2n 2 + n é O(n 3 ).

  Exercício 2: Prove que g(n) = 3n 3 +2n 2 + n é O(n 3 ).

  

  Seja c = 6 e m = 0. Então 3n 3 +2n 2

  • n ≤ 6n
  • 3 para n ≥ 0

  

  Quando a notação O é usada para expressar o tempo de execução de um algoritmo no pior caso, está se definindo também o limite (superior) do tempo de execução desse algoritmo para todas as entradas.

  

  Operações com a notação O:

  

  Exercício 3: Suponha três trechos de 2 programa cujos tempos são O(n), O(n ) e O(n log n). Qual a ordem de complexidade do programa?

  

  Exercício 4: Prove que o produto de [log n + k + O(1/n)] por [n + O(n)] é nlogn + Kn + O(n log n).

  

  Definição: Uma função f(n) é (g(n)) se existem duas constantes c e m tais que, para todo n  m, f(n)  c g(n).

  

m

  

  A notação  especifica um limite inferior para f(n).

  Pode-se dizer que g(n) é um limite assintótico inferior (em inglês, asymptotic lower bound) para f(n).

   Exemplo: Para mostrar que g(n) = 3n

  3

  2 é (n

  • 2n

  3 ), basta fazer c = 1, e então 3n

  3

  2  n

  • 2n

  3 para n  0.

  

  Quando a notação é usada para expressar o tempo de execução de um algoritmo no melhor caso, está se definindo também o limite (inferior) do tempo de execução desse algoritmo para todas as entradas.

  

  Exercício 5: O que significa dizer que “o tempo de execução” (i.e., sem especificar se é para o pior caso, melhor caso, ou caso médio) é (g(n))?

  

  Exercício 5: O que significa dizer que “o tempo de execução” (i.e., sem especificar se é para o pior caso, melhor caso, ou caso médio) é (g(n))? O tempo de execução desse algoritmo é pelo menos uma constante vezes g(n) para valores suficientemente grandes de n.

  

  Definição: Uma função f(n) é (g(n)) se existirem constantes positivas c , c e m tais 1 2 que, para todo n  m, 0  c g(n)  f(n)  c g(n). 1 2 m

  

  A notação  limita a função por fatores constantes.

  Em outras palavras, para todo n  m, a função f(n) é igual a g(n) a menos de uma constante.

  Neste caso, g(n) é um limite assintótico firme . para f(n).

   Exemplo: 

  Para provar esta afirmação, devemos achar constantes c > 0, c > 0, n > 0, tais que: 1 2 para todo n  m.

  (Cormen)

   2 Se dividirmos a expressão acima por n temos: 

  

O lado direito da desigualdade será válido para

qualquer valor de n  1 quando escolhemos c  2 1/2.

  (Cormen)

   Fazendo 1/2 - 3/n > 0, obtém-se que n > 6. Logo, o valor n = 7 pode ser escolhido.

  

Portanto, o lado esquerdo da desigualdade será

válido para qualquer valor de n > 7 e, escolhendo

m = 7, c1 = 1/14.

  (Cormen)

   Logo, escolhendo c = 1/14 1 c = 1/2 2 m = 7 2 2 é possível verificar que n /2 – 3n = (n ).

  Note que existem outras escolhas para as constantes c e c , mas o fato importante é 1 2 que a escolha existe.

  

  O limite assintótico superior definido pela notação O pode ser assintoticamente firme ou não. Exemplo: 2 2 2n = O(n ) é assintoticamente firme. 2 2n = O(n ) não é.

  

  A notação o é usada para definir um limite superior que não é assintoticamente firme.

  Definição: Uma função f(n) é o(g(n)) se, para qualquer constante c > 0 e para todo n  m, 0  f(n) < c g(n).

   2 2 2

   Exemplo: 2n = o(n ) mas 2n o(n ). Na notação o, a função f(n) tem um crescimento muito menor que g(n) quando n tende para o infinito.

  

  Intuitivamente, a função f(n) tem um crescimento muito menor que g(n) quando n tende para infinito. Isto pode ser expresso da seguinte forma:

  

  Por analogia, a notação  está relacionada com a notação  da mesma forma que a notação o está relacionada com a notação O.

  Definição: Uma função f(n) é (g(n)) se, para qualquer constante c > 0, para todo n  m, 0  c g(n) < f(n).

  

  Exemplo: n 2 /2 = (n) mas n 2 /2 

  (n 2 ).

  

  A relação f(n) = (g(n)) implica em se o limite existir.

  

  Ziviani, N. Projeto de algoritmos: com

implementações em Pascal e C. 3 ed.

Editora Cengage Learning, 2011.

  Cormen, T. et al. Introduction to Algorithms. Prentice-Hall of India, 2001.

  Loureiro, A. Projeto e Análise de Algoritmos: Análise de Complexidade.

  Notas de aula, 2010.

Novo documento