Análise de Algoritmos

2,477 views

Published on

Introdução à Análise de Algoritmos

Published in: Education

Análise de Algoritmos

  1. 1. Universidade Presbiteriana Mackenzie   Aula  2:  Análise  de  Algoritmos   Prof. Ms. Daniel Arndt Alves Faculdade  de  Computação  e  Informá;ca   Computação e Informática Faculdade de Estrutura  de   Dados  II   Análise  de  Algoritmos   1  Daniel  Arndt  Alves  
  2. 2. Obje6vos   •  Por  que  analisar  a  complexidade  dos   algoritmos?   – A  preocupação  com  a  complexidade  dos   algoritmos  é  fundamental  para  projetar   algoritmos  eficientes.   – Podemos  desenvolver  um  algoritmo  e  depois   analisar  a  sua  complexidade  para  verificar  a  sua   eficiência.   – Mas  o  melhor  ainda  é  ter  a  preocupação  de   projetar  algoritmos  eficientes  desde  a  sua   concepção.   Análise  de  Algoritmos   2  
  3. 3. Análise  de  Algoritmos   •  A  Análise  de  Algoritmos  é    um  campo  da   Ciência  da    Computação  que  tem  como     obje6vo  o  entendimento  da    complexidade   dos  algoritmos.   •  O  obje6vo  desta  aula  consiste  em  desenvolver   as    habilidades  de  fazer    julgamentos   elementares  da    avaliação  dos  programas.   Análise  de  Algoritmos   3  
  4. 4. Análise  de  Algoritmos   •  Existem    muitos    critérios    com    os    quais     podemos    julgar  um  programa,  por  exemplo:     –  Será  que  ele  faz  o  que  se  espera  que  ele  faça?   –  Será  que  ele  funciona  corretamente    de    acordo    com   as    especificações?   –  Existe  documentação  explicando  como  usá-­‐lo  e  como   ele    trabalha?   –  O  código  está  legível?   •  Os  critérios  acima  são  muito  importantes  quando   se  escreve    soSware,    especialmente    para     grandes    sistemas.   Análise  de  Algoritmos   4  
  5. 5. Eficiência  ou  Complexidade  de  Algoritmos   •  Para  um  dado  problema,  considere  dois   algoritmos  que  o  resolvem:     – Seja  n  um  parâmetro  que  caracteriza  o  tamanho   da  entrada  do  algoritmo.  Por  exemplo,  ordenar  n   números  ou  mul6plicar  duas  matrizes  quadradas   n  x  n  (cada  uma  com  n2  elementos).     – Como  podemos  comparar  os  dois  algoritmos  para   escolher  o  melhor?   Análise  de  Algoritmos   5  
  6. 6. •  Existem    ainda    outros    critérios    diretamente     relacionados  com  o  desempenho:     – tempo  de  computação   – requisitos  de  memória   •  A    avaliação    de    desempenho    pode    ser     liberalmente  dividida  em  2  partes:   1.  es6ma6vas  precedentes  e     2.  testes  posteriores   Análise  de  Algoritmos   6   Complexidade  de  tempo  ou  de  espaço  
  7. 7. Complexidade  de  tempo  ou  de  espaço   •  Precisamos  definir  alguma  medida  que  expresse  a   eficiência.  Costuma-­‐se  medir  um  algoritmo  em  termos   de  tempo  de  execução  ou  o  espaço  (de  memória)   u6lizado.   –  Para  o  tempo,  podemos  considerar  o  tempo  absoluto  (em   minutos,  segundos,  etc.).  Medir  o  tempo  absoluto  não  é   interessante  por  depender  fortemente  da  máquina.   –  Em  Análise  de  Algoritmos  conta-­‐se  o  número  de  operações   consideradas  relevantes  realizadas  pelo  algoritmos  e   expressa-­‐se  esse  número  como  uma  função  de  n.  Essas   operações  podem  ser  comparações,  operações   aritmé6cas,  movimento  de  dados,  etc.   Análise  de  Algoritmos   7  
  8. 8. •  Considere  inicialmente  uma  es6ma6va  precedente.   Suponha    que    em    algum    ponto    do    seu    programa     encontra-­‐se  a  instrução:   x = x + 1;   •  Gostaríamos  de  determinar  dois  valores  para  esta     instrução:   –  a  duração  de  tempo  para  uma  única  execução;   –  a  quan6dade  de  vezes  que  ela  é  executada.   •  O    produto    desses    valores    será  o    tempo    total    tomado   por  esta  instrução.   •  A  segunda  esta_s6ca  é  chamada  de  contagem  de   frequência  e  varia  de  um  conjunto  de  dados  para    outro.     Análise  de  Algoritmos   8   Complexidade  de  tempo  ou  de  espaço  
  9. 9. •  Uma  das  tarefas  mais  dibceis,  em  es6ma6va  de  contagem     de  frequência,  é  a  seleção  adequada  de  amostras  de  dados     •  Será  impossível    determinar    exatamente    quanto    tempo     levará  a    execução    de    qualquer    comando,    a    menos    que     tenhamos  as  informações  seguintes:   –  máquina  onde  a  instrução  será  executada;   –  conjunto  de  instruções  da  linguagem  da  máquina;   –  os  tempos  necessários  para  cada  instrução  da  máquina;   –  a  tradução  que  um  compilador  fará  do  código  fonte  para  a   linguagem    da  máquina.     •  Assim,  é  possível  determinar  esses  valores  escolhendo  uma     máquina  real  e  um  compilador  existente.   Análise  de  Algoritmos   9   Complexidade  de  tempo  ou  de  espaço  
  10. 10. •  Outra  alterna6va  consiste  em  definir  um  computador   hipoté6co  (com  um  tempo  de  execução    imaginário),   porém  mantendo  os  tempos    razoavelmente  próximos   dos  equipamentos    existentes,  para  que  os  valores   resultantes  sejam    representa6vos.   •  Nenhuma  dessas  alterna6vas  mostra-­‐se  adequada,     pois  em  ambos  os  casos  o  tempo    determinado     provavelmente  não  se  aplicará  a  muitos     computadores.   •  Também  a  variação  do  compilador  de  uma  máquina   para  outra  representará  um  problema.   Análise  de  Algoritmos   10   Complexidade  de  tempo  ou  de  espaço  
  11. 11. •  Todas  essas  considerações  conduzem-­‐nos  a  limitar     nossos    obje6vos    em    uma    análise    a    priori.     •  Vamos    nos    concentrar    inicialmente  apenas    no   desenvolvimento  da  contagem  de  frequência    para   todas  as  instruções       •  Considere  os  seguintes  três  exemplos:   Análise  de  Algoritmos   11   x = x + 1;   for (i = 1; i <= n; i++) x = x + 1;   for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) x = x + 1;   (a)   (b)   (c)   Complexidade  de  tempo  ou  de  espaço  
  12. 12. Análise  de  Algoritmos   •  No  programa  (a)  assumimos  que  a  instrução    x = x + 1   não  está  incluída  dentro  de  nenhum  laço  explícito  ou   implícito.  Neste  caso,  a  contagem  de  frequência  é  1   (um)     •  •  No  programa  (b)  a  mesma  instrução  será  executada  n   vezes   •  No  programa  (c)  n2  vezes  (assumindo  n  >  1)   •  Os  valores  1,  n  e  n2  são  as  ordens  de  grandeza     Análise  de  Algoritmos   12   x = x + 1;   for (i = 1; i <= n; i++) x = x + 1;   for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) x = x + 1;   (a)   (b)   (c)  
  13. 13. •  Em  geral,  na  análise  de  algoritmos  são  avaliadas   as  situações  (para  uma  entrada  de  tamanho  n)  da     complexidade  do:   –  pior  caso  do  algoritmo  (worst  case)  que  é  uma  função   definida  pelo  número  máximo  de  passos  u6lizados;     –  caso  médio  do  algoritmo  (average  case)  que  é  uma   função  definida  pelo  número  médio  de  passos   u6lizados;   –  melhor  caso  do  algoritmo  (best  case)  que  é  uma   função    definida  pelo  número  mínimo  de  passos   u6lizados;   Análise  de  Algoritmos   13   Pior  caso,  melhor  caso,  caso  médio  
  14. 14. •  Na    análise    de    execução,    a    preocupação     principal    consiste    na    determinação    de     ordem    de    grandeza    de  um  algoritmo  (pior   caso)   Análise  de  Algoritmos   14   Pior  caso,  melhor  caso,  caso  médio  
  15. 15. Pior  caso,  melhor  caso,  caso  médio   •  O  número  de  operações  realizadas  por  um   determinado  algoritmo  pode  depender  da   par6cular  instância  da  entrada.  Em  geral   interessa-­‐nos  o  pior  caso,  i.e.,  o  maior  número  de   operações  usadas  para  qualquer  entrada  de   tamanho  n.   •  Análises  também  podem  ser  feitas  para  o  melhor   caso  e  o  caso  médio.  Neste  úl6mo,  supõe-­‐se   conhecida  uma  certa  distribuição  da  entrada.   Análise  de  Algoritmos   15  
  16. 16. Pior  caso,  melhor  caso,  caso  médio   •  Exemplo:  Busca  seqüencial  de  um  dado   elemento  em  um  vetor  armazenando  n   elementos  de  forma  aleatória.  Discuta  o  pior   caso,  melhor  caso  e  o  caso  médio.  No  caso   médio,  suponha  a  distribuição  uniforme  e  que   o  dado  buscado  está  dentro  do  vetor.   •  Como  muda  o  caso  médio  se  o  dado  em  geral   não  está  presente?   Análise  de  Algoritmos   16  
  17. 17. Análise  de  Algoritmos   17   Pior  caso,  melhor  caso,  caso  médio  
  18. 18. Complexidade  de  tempo   •  Como  exemplo,  considere  o  número  de   operações  de  cada  um  dos  algoritmos  que   resolvem  o  mesmo  problema,  como  função  de  n:   –  Algoritmo  1:  f1(n)  =  2n2  +  5n  operações   –  Algoritmo  2:  f2(n)  =  500n  +  4000  operações   •  Dependendo  do  valor  de  n,  o  Algoritmo  1  pode   requerer  mais  ou  menos  operações  que  o   Algoritmo  2.   •  (Compare  as  duas  funções  para  n  =  10  e   n  =  100).   Análise  de  Algoritmos   18  
  19. 19. Complexidade  de  Tempo   – Algoritmo  1:  f1(n)  =  2n2  +  5n  operações   – Algoritmo  2:  f2(n)  =  500n  +  4000  operações   •  Um  caso  de  par6cular  interesse  é  quando  n   tem  valor  muito  grande                              ,  denominado   comportamento  assintó;co.   •  Os  termos  inferiores  e  as  constantes   mul6plica6vas  contribuem  pouco  na   comparação  e  podem  ser  descartados.   Análise  de  Algoritmos   19   n → ∞( )
  20. 20. Complexidade  de  Tempo   •  O  importante  é  observar  que  f1(n)  cresce  com   n2,  ao  passo  que  f2(n)  cresce  com  n.  Um   crescimento  quadrá6co  é  considerado  pior   que  um  crescimento  linear.  Assim,  vamos   preferir  o  Algoritmo  2  ao  Algoritmo  1.   Análise  de  Algoritmos   20  
  21. 21. Complexidade  de  tempo   •  Para  determinar  a  ordem  de  grandeza,  usa-­‐se     frequentemente  as  fórmulas  como:   •  no  segmento  do  programa  (c)  anterior  a   instrução    x = x + 1  é  executada   for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) x = x + 1; •  Em  geral   Análise  de  Algoritmos   21  
  22. 22. Exemplo   •  Considere    o    algoritmo   para  cálculo  do  fatorial     de  um  número  inteiro  n     dado  a  seguir:   •  Cada  instrução  é  contada  uma  vez     •  O  tempo  atual  tomado  por  cada    instrução   naturalmente  poderá  variar     •  A  instrução  for  é  na  verdade  uma     combinação  de  diversas  instruções,    mas   aqui  vamos  contá-­‐la  como  uma     •  Então,  a  contagem  total    é  2n  +  1,  como  é   mostrado  na  tabela  seguinte:   Análise  de  Algoritmos   22   1 int fatorial(int n){ 2 int i, produto; 3 4 produto = 1; 5 for(i = 2; i <= n; i++) 6 produto = produto * i; 7 return produto 8 } Linhas   n   Frequência   4,  5,  7   0   3   4,  5,  7   1   3   4,  5,  6,  5,  7   2   3  +  2   4,  5,  6,  5,  6,  5,  7   3   3  +  4   4,  5,  6,  5,  6,  5,  6,  5,  7   4   3  +  6   n   3+2(n-­‐1)  =  2n  +  1   Frequentemente,  isso  é  declarado  como   O(n),  ignorando  as  constantes  
  23. 23. Notação  “O”   •  Definição:  O(g(n))  =  {f(n)  :    existem  duas   constantes  c  e  n0  tais  que  |f(n)|  <=  |c*g(n)|,     para  todo  n  >  n0}     •  Como,  normalmente,  é  dibcil  determinar  com     exa6dão  f(n),  a  notação  “O”  é  u6lizada     •  •  Assim,  a  notação  “O”  fornece  um  limite   superior  para  uma  função  dentro  de  um  fator     constante   Análise  de  Algoritmos   23  
  24. 24. Notação  “O”   Análise  de  Algoritmos   24  
  25. 25. Notação  “O”   •  Dado  um  algoritmo,  analisamos  a  contagem  de  frequência     para  cada  instrução  e  somamos  todas   •  Isto  normalmente  resulta  em  um  polinômio  do  6po  (ck!=  0)   P(n)  =  cknk  +  ck-­‐1nk-­‐1  +  ...  +  c1n  +  c0   •  Usando  a  notação  “O”   P(n)  =  cknk  +  ck-­‐1nk-­‐1  +  ...  +  c1n  +  c0  =  O(nk)     •  Por  outro  lado,  se  qualquer  passo  for  executado  2n  vezes   ou    mais  a  expressão  será  (c  !=  0)     c2n+  P(n)  =  c2n  +  cknk  +  ck-­‐1nk-­‐1  +  ...  +  c1n  +  c0  =  O(2n)     •  Assim,  na  notação  “O”,  considera-­‐se  apenas  o  termo  de     maior  ordem     Análise  de  Algoritmos   25  
  26. 26. Notação  “O”   Análise  de  Algoritmos   26  
  27. 27. Notação  “O”   •  Dada  uma  função  g(n),  denotamos  por  O(g(n))   o  conjunto  das  funções:   •  Isto  é,  para  valores  de  n  suficientemente   grandes,  f(n)  é  igual  ou  menor  que  g(n).   Análise  de  Algoritmos   27   f n( ):∃ constantes c e n0 tais que 0 ≤ f n( )≤ c⋅g n( ) para n ≥ n0{ }
  28. 28. Notação  “O”   •  Como  abuso  da  notação,  vamos  escrever                                        ao  invés  de                                      .   – Algoritmo  1:  f1(n)  =  2n2  +  5n  =  O(n2)   – Algoritmo  2:  f2(n)  =  500n  +  4000  =  O(n)   •  Um  polinômio  de  grau  d  é  de  ordem  O(nd).   Como  uma  constante  pode  ser  considerada   um  polinômio  de  grau  0,  então  dizemos  que   uma  constante  é  O(n0)  ou  seja,  O(1).   Análise  de  Algoritmos   28   f n( )= O g n( )( ) f n( )∈O g n( )( )
  29. 29. Notação  “O”   •  A  notação   –  O(1)    indica    que    o    tempo    de    computação    é  constante,     independentemente  de  qualquer  fator   –  O(n)  chama-­‐se  linear   –  O(n2)  chama-­‐se  quadrá6ca   –  O(n3)  chama-­‐se  cúbica   –  O(2n)  chama-­‐se  exponencial   •  Os    tempos    de    computação    O(1),    O(log  n),    O(n),   O(n  log  n),    O(n2),    O(n3)    e    O(2n)    são    aqueles     comumente    encontrados    e    os    quais    vamos     trabalhar    no    decorrer    do    curso,    e    log  n  é,     normalmente,  o  logaritmo  de  n  na  base  2.   Análise  de  Algoritmos   29  
  30. 30. Notação  “O”   •  Possuindo  dois  algoritmos  para  desempenhar   a  mesma  tarefa,  sendo  o    primeiro  com  um   tempo  de  computação  O(n)    e  o  segundo   O(n2),  geralmente  considera-­‐se    o  primeiro   como  superior   •  Isso  porque  à  medida  que  n  aumenta,  o   tempo  de  processamento  do  segundo     algoritmo  vai  piorar  muito  comparando  com  o     tempo  do  primeiro   Análise  de  Algoritmos   30  
  31. 31. Notação  “O”   Análise  de  Algoritmos   31  
  32. 32. Exercício   Análise  de  Algoritmos   32  
  33. 33. Solução   1 y = 0; 2 for (i = N; i >= 0; i--) 3 y = a[i] + x * y;   Análise  de  Algoritmos   33  
  34. 34. Solução   1 float horner(int N, float a[], float x){ 2 int i; 3 float y; 4 5 y = 0; 6 for (i = N; i >= 0; i--) 7 y = a[i] + x * y; 8 return y; 9 }   Análise  de  Algoritmos   34  
  35. 35. Exercício   Análise  de  Algoritmos   35  
  36. 36. Solução  An,n  e  Bn,n   Análise  de  Algoritmos   36  
  37. 37. Solução  An,m  e  Bm,r   Análise  de  Algoritmos   37  
  38. 38. Exercício   Análise  de  Algoritmos   38  
  39. 39. Solução  (maior  de  a)   1 float maior(int n, float a[]){ 2 int i; 3 float x; 4 5 x = a[1]; 6 for(i = 2; i <= n; i++) 7 if(x < a[i]) 8 x = a[i]; 9 return x; 10 }   Análise  de  Algoritmos   39  
  40. 40. Exercícios   Análise  de  Algoritmos   40  
  41. 41. Notação  “Ω”   Análise  de  Algoritmos   41  
  42. 42. Notação  “Θ”   Análise  de  Algoritmos   42  
  43. 43. Importância   Análise  de  Algoritmos   43   •  (Verifique  se  resolveria  usar  uma  máquina   mais  rápida  onde  uma  operação  leve  1ps  (pico   seundo)  ao  invés  de  1  ms:  ao  invés  de  10137   séculos,  seriam  10128  séculos  :-­‐)  
  44. 44. Importância   •  Podemos  muitas  vezes  melhorar  o  tempo  de   execução  de  um  programa  o6mizando  o   código  (ex.  usar  x  +  x  ao  invés  de  2  x,  evitar  o   re-­‐cálculo  de  expressões  já  calculadas,  etc.).   •  Entretanto,  melhorias  muito  mais  substanciais   podem  ser  ob6das  se  usarmos  um  algoritmo   diferente,  com  outra  complexidade  de  tempo,   Ex.  obter  um  algoritmo  de  O(n  log  n)  ao  invés   de  O(n2).   Análise  de  Algoritmos   44  
  45. 45. Cota  superior  ou  limite  superior  (upper  bound)   Análise  de  Algoritmos   45  
  46. 46. Cota  superior  ou  limite  superior  (upper  bound)   Análise  de  Algoritmos   46  
  47. 47. Analogia  com  record  mundial   Análise  de  Algoritmos   47  
  48. 48. Sequência  de  Fibonacci   Análise  de  Algoritmos   48  
  49. 49. Algoritmo  1:  função  fibo1(n)   Análise  de  Algoritmos   49  
  50. 50. Algoritmo  2:  função  fibo2(n)   Análise  de  Algoritmos   50  
  51. 51. Cota  inferior  (lower  bound)   Análise  de  Algoritmos   51  
  52. 52. Cota  inferior  para  mul6plicação  de  matrizes   Análise  de  Algoritmos   52  
  53. 53. Meta:  aproximando  as  duas  cotas   Análise  de  Algoritmos   53  
  54. 54. Resumo   Análise  de  Algoritmos   54  
  55. 55. Análise  de  Algoritmos   55  
  56. 56. Análise  de  Algoritmos   56  
  57. 57. Obrigado     Daniel  Arndt  Alves   daniel.alves@mackenzie.br   Análise  de  Algoritmos   57  

×