Análise de
Algoritmos

 Profa. Maria Inés Castiñeira, Dra.
 Unisul – Campus Grande Florianópolis
 Ciência da Computação
O que é um algoritmo?

   Algoritmo: Sequência finita e ordenada de
    instruções necessárias para a resolução
    de um problema bem formulado, possível
    de ser implementado em computador,
    que sempre termina num determinado
    período de tempo, produzindo o resultado
    ou indicando a impossibilidade de
    obtenção do mesmo.
   Estruturas de Dados: forma ou processo
    de guardar informação
Algoritmos e Estruturas de
Dados
   Algoritmos são métodos para resolver problemas
      problemas têm dados
      dados são tratados (neste contexto)
       computacionalmente
   O Processo de organização dos dados pode
    determinar a eficiência do algoritmo
      algoritmos simples podem requerer estruturas de
       dados complexas
      algoritmos complexos podem requerer estruturas de
       dados simples
   Para maximizar a eficiência de um algoritmo as
    estruturas de dados utilizadas têm de ser projetadas
    em simultâneo com o desenvolvimento do algoritmo
Algoritmos: área de estudo e
pesquisa
   Suficientemente antiga que os conceitos básicos e a
    informação essencial são bem conhecidos
   Suficientemente nova de forma a permitir novas
    descobertas e novos resultados
   Imensas áreas de aplicação:
      Ciência (Ex: Genoma humano)
      Engenharia (problemas de otimização)
      Comerciais (e-commerce, logística)
      Saúde (Política:distribuição de recursos escasos;
        Análise e tratamento de imagens para
        diagnóstico, ...)
      Internet: definição de roteamento (grafos), algoritmos
        de busca e indexação.
Porquê estudar
complexidade?
   Serve para escolher entre vários algoritmos o mais
    eficiente

   Desenvolver algoritmos novos e mais eficazes para
    problemas que já tem solução

   Melhorar os algoritmos existentes

   Permite saber se para um determinado problema é
    viável obter o resultado com um dado algoritmo

   Permite saber se para um dado problema é viável
    obter o resultado para um certo número de valores de
    entrada e um algoritmo determinado
Como analisar Algoritmos?
   Para avaliar e comparar algoritmos
    diversas características podem ser
    utilizadas:
     Tempo de execução
     Memória usada (espaço)
     Linhas de código
     Robustez (comportamento com dados
      não esperados)
     Correta obtenção do resultado
     Qualidade do código
Variáveis na análise de
Algoritmos
              
              
              
                 TEMPO
              
              
              
              
Análise temporal
   È a forma mais utilizada

   Pode ser realizada de dois formas:

       Tempo real: necessário para execução
        do algoritmo. Como medir?
       Número de instruções necessárias à
        execução
Análise de Algoritmos

   Análise precisa do tempo (medindo durante a
    execução) é uma tarefa complicada:
      algoritmo é implementado numa dada linguagem
      linguagem é compilada e programa é executado
       num dado computador
      difícil prever tempos de execução de cada instrução
       e antever otimizações
      muitos algoritmos são "sensíveis" aos dados de
       entrada
      muitos algoritmos não são bem compreendidos


   Medidas de análise devem ser independentes da
    tecnologia (hardware/software)
   Para prever o tempo de execução de um programa
    apenas é necessário um pequeno conjunto de
    ferramentas matemáticas
Complexidade de Algoritmos
   A análise de algoritmos (complexidade do algoritmo)
    serve para medir a quantidade de trabalho realizada
    pelo algoritmo.
   Essa quantidade é expressa em função de operações
    fundamentais, as quais variam de acordo com o
    algoritmo, e em funçao do volume de dados
    Exemplo: Exiba mensagem inicial;
              Abra arquivo X; Crie arquivo Xbis;
              Enquanto (not FinalArquivo X ) faça:
              { Leia w em X;
                Escreva w em Xbis;
              }
              Feche X; Feche Xbis.

    Operações fundamentais? Leia w e/ou Escreva w
Operações primitivas ou
fundamentais

   Atribuição de valor a uma variável;
   Chamada de métodos
   Operações aritméticas;
   Comparação de dois números;
   Acesso a um elemento de um array
   Retorno de um método
   .....

Análise de Algoritmos
   Que dados usar?

       dados reais: verdadeira medida do custo de
        execução
       dados aleatórios: assegura-nos que as
        experiências testam o algoritmo e não
        apenas os dados específicos – Caso médio
       dados perversos: mostram que o
        algoritmo funciona com qualquer tipo de
        dados. – Pior caso!
       dados benéficos: – Melhor caso
Dados de entrada: Pior caso

   Por que é importante estudar o pior caso na
    análise de algoritmos?

       ele é um limite superior, nunca vai ser pior
        do que isso!
       Ele ocorre com bastante frequência em
        alguns algoritmos (pesquisa de um item em
        uma lista sendo que o item não se encontra
        na lista)
       Muitas vezes o caso médio é tão ruim
        quanto o pior caso.
Medida do Tempo de
Execução de um Programa

• O projeto de algoritmos é fortemente influenciado pelo
   estudo de seus comportamentos.
• Depois que um problema é analisado e decisões de
   projeto são finalizadas, é necessário estudar as várias
   opções de algoritmos a serem utilizados,
   considerando os aspectos de tempo de execução e
   espaço ocupado.
• Muitos desses algoritmos são encontrados em áreas
   como pesquisa operacional, otimização, teoria dos
   grafos, estatística, probabilidades, entre outras.
Análise: Crescimento de
Funções
   O tempo de execução geralmente dependente de
    um único parâmetro N
      ordem de um polinômio
      tamanho de um arquivo a ser processado, ordenado,
       etc, ou,
      medida abstrata do tamanho do problema a
       considerar (usualmente relacionado com o
       número de dados a processar)
   Quando há mais de um parâmetro
      procura-se exprimir todos os parâmetros em função
       de um só
      faz-se uma análise em separado para cada
       parâmetro
Análise: Crescimento de
Funções
   Os Algoritmos têm tempo de execução
    proporcional a

1 - muitas instruções são executadas uma só vez ou
   poucas vezes (se isto for verdade para todo o
   programa diz-se que o seu tempo de execução é
   constante)
logN - tempo de execução é logarítmico (cresce
   ligeiramente à medida que N cresce) (quando N
   duplica log N aumenta mas muito pouco; apenas
   duplica quando N aumenta para N^2)
N - tempo de execução é linear. Típico quando algum
   processamento é feito para cada dado de entrada.
   Situação ótima quando é necessário processar N
   dados de entrada, ou produzir N dados na saída.
Análise: Crescimento de
Funções
N log N - típico quando se reduz um problema em
   sub-problemas, se resolve estes separadamente e se
   combinam as soluções (se N é 1 milhão N log N é
   perto de 20 milhões)
N2 - tempo de execução quadrático (típico quando é
   preciso processar todos os pares de dados de
   entrada) (prático apenas em pequenos problemas, ex:
   produto matriz - vetor)
N3 - tempo de execução cúbico (para N = 100,
   N^3 = 1 milhão, ex: produto de matrizes)
2N - tempo de execução exponencial (provavelmente de
   pouca aplicação prática; típico em soluções de força
   bruta) (para N = 20, 2^N = 1 milhão; N duplica,
   tempo passa a ser o quadrado)
Tamanho de problemas que
podem ser resolvidos
Seja n a quantidade de dados que um algoritmo pode
processar. Esse algoritmo demora f(n) microssegundos (µs)
para resolver o problema.

A tabela apresenta o maior tamanho n de um problema que
pode ser resolvido no tempo t=1 segundo e tempo =1 minuto.

         f(n)       1 segundo      1 minuto
                                  Math ERROR:
         ln(n)     < 3 * 10^100   Muito grande!
           n         1000000       60000000
          n2          1000            7700
          2n           20              26
          n!           10              11
Notação "O grande"

      Notação matemática que nos permite
       suprimir detalhes na análise de algoritmos

      g(n)=O(f(n))


g(n) é da ORDEM de
f(n)
c0.f(n) é um limite
superior para g(n) a
partir de um valor n0
Notação "O grande"

   Definição: uma função g(N) diz-se ser
    O(f(N)) se existem constantes c0 e N0 tais
    que g(N) < c0 f(N) para qualquer N > N0
   A notação é usada com três objetivos:
    1.   limitar o erro que é feito ao ignorar os
         termos menores nas fórmulas matemáticas
    2.   limitar o erro que é feito na análise ao
         desprezar parte de um programa que
         contribui de forma mínima para o
         custo/complexidade total
    3.   permitir-nos classificar algoritmos de
         acordo com limites superiores no seu
         tempo de execução.
Forma para determinação de
complexidade
   Suponha o seguinte código

         for (i = 0; i < N; i++) { instruções; }

    contabilização do número de instruções é simples: N iterações e
    em cada uma são executadas um numero constante de
    instruções: O(N)

   Suponha o código seguinte:

          for (i = 0; i < N; i++) {
              for (j = 0; j < N; j++) {
                      instruções;
              }
          }
    contabilização do número de instruções é ainda simples: loop
    interno é O(N) e é executado N vezes: O(N2)
Como melhorar o
desempenho?
   Se existe um algoritmo A de ordem
    O(n)=n e outro B de ordem O(n)=n!
    então é preferível utilizar A.

   Se não temos ou conhecemos o
    algoritmo apropriado?
    Usar técnicas de projeto de algoritmos
Técnicas de Projeto de
Algoritmos
   Dividir para conquistar (Divide-and-
    Conquer)
   Programação dinámica (otimização)
   Procura ganânciosa-gulosa (Greedy -
    otimização)
   Branch-and-bound ( Pruning)
   Aprendizagem (Machine Learning)
   Aleatórios (Randomized)
   Procura exaustiva ou força bruta (Brute
    Force ou Backtraking)
Técnicas de Projeto
   Dividir para conquistar (Divide-and-
    Conquer)
       Resolver um problema grande pode ser
        muito difícil, mas resolver dois problemas
        menores pode se tornar significativamente
        mais simples
       Divide o problema em problemas menores e
        resolve cada um de uma forma
        independente
       Combina as soluções de todos os
        subproblemas para obter a solução do
        problema original
       A etapa de recombinação das soluções é
        normalmente crítica e dispendiosa em
        termos de tempo
Técnicas de projeto de Alg.

   Programação dinâmica (otimização)
       Uma série de escolhas deve ser feita
        para atingir a solução ótima
       A medida que as escolhas são
        realizadas surgem subproblemas da
        mesma forma, que podem aparecer
        repetidamente.
       A idéia é guardar a solução para
        cada um desses subproblemas.
       Tempo exponencial pode ser
        transformado em polinomial
Técnicas de projeto de Alg.

   Procura ganânciosa (Greedy, otimização)
       Muitos algoritmos têm procedimentos
        iterativos e escolhem em cada iteração um
        número de possíveis alternativas
       Escolhe as alternativas mais atrativas,
        algumas podem levar à solução, outras
        não.
       Pode não levar à solução correta
Técnicas de projeto de Alg.

   Procura exaustiva ou força bruta (Brute
    Force)
       O algoritmo examina todas as alternativas
        possíveis para encontrar uma solução
        particular.
       Pode não encontrar uma solução em tempo
        útil, mas garante que a encontra
   Branch-and-bound ( Pruning)
       Ignora um conjunto de alternativas
        desnecessárias
       Menor tempo de execução e garante que
        encontra a solução
Técnicas de Projeto
   Aprendizagem (Machine Learning)
    Baseiam a sua estratégia na análise
    computacional de dados previamente
    colecionados
   Aleatórios (Randomized)
    Em cada passo pode ser atirada uma
    moeda ao ar para decidir o passo seguinte
    Existem problemas práticos onde estes
    algoritmos são competitivos relativamente
    aos algoritmos determinísticos
Referências

   CORMEN, T.H et al. Algoritmos: Teoria e
    prática. 2a Ed. Campus, RJ, 2002.
   FREITAS, Ana Teresa. Análise de
    Algoritmos. Material didático (.pdf),
    INESC-ID/IST, 2005.

Analise Algoritmos

  • 1.
    Análise de Algoritmos Profa.Maria Inés Castiñeira, Dra. Unisul – Campus Grande Florianópolis Ciência da Computação
  • 2.
    O que éum algoritmo?  Algoritmo: Sequência finita e ordenada de instruções necessárias para a resolução de um problema bem formulado, possível de ser implementado em computador, que sempre termina num determinado período de tempo, produzindo o resultado ou indicando a impossibilidade de obtenção do mesmo.  Estruturas de Dados: forma ou processo de guardar informação
  • 3.
    Algoritmos e Estruturasde Dados  Algoritmos são métodos para resolver problemas  problemas têm dados  dados são tratados (neste contexto) computacionalmente  O Processo de organização dos dados pode determinar a eficiência do algoritmo  algoritmos simples podem requerer estruturas de dados complexas  algoritmos complexos podem requerer estruturas de dados simples  Para maximizar a eficiência de um algoritmo as estruturas de dados utilizadas têm de ser projetadas em simultâneo com o desenvolvimento do algoritmo
  • 4.
    Algoritmos: área deestudo e pesquisa  Suficientemente antiga que os conceitos básicos e a informação essencial são bem conhecidos  Suficientemente nova de forma a permitir novas descobertas e novos resultados  Imensas áreas de aplicação:  Ciência (Ex: Genoma humano)  Engenharia (problemas de otimização)  Comerciais (e-commerce, logística)  Saúde (Política:distribuição de recursos escasos; Análise e tratamento de imagens para diagnóstico, ...)  Internet: definição de roteamento (grafos), algoritmos de busca e indexação.
  • 5.
    Porquê estudar complexidade?  Serve para escolher entre vários algoritmos o mais eficiente  Desenvolver algoritmos novos e mais eficazes para problemas que já tem solução  Melhorar os algoritmos existentes  Permite saber se para um determinado problema é viável obter o resultado com um dado algoritmo  Permite saber se para um dado problema é viável obter o resultado para um certo número de valores de entrada e um algoritmo determinado
  • 6.
    Como analisar Algoritmos?  Para avaliar e comparar algoritmos diversas características podem ser utilizadas:  Tempo de execução  Memória usada (espaço)  Linhas de código  Robustez (comportamento com dados não esperados)  Correta obtenção do resultado  Qualidade do código
  • 7.
    Variáveis na análisede Algoritmos     TEMPO    
  • 8.
    Análise temporal  È a forma mais utilizada  Pode ser realizada de dois formas:  Tempo real: necessário para execução do algoritmo. Como medir?  Número de instruções necessárias à execução
  • 9.
    Análise de Algoritmos  Análise precisa do tempo (medindo durante a execução) é uma tarefa complicada:  algoritmo é implementado numa dada linguagem  linguagem é compilada e programa é executado num dado computador  difícil prever tempos de execução de cada instrução e antever otimizações  muitos algoritmos são "sensíveis" aos dados de entrada  muitos algoritmos não são bem compreendidos  Medidas de análise devem ser independentes da tecnologia (hardware/software)  Para prever o tempo de execução de um programa apenas é necessário um pequeno conjunto de ferramentas matemáticas
  • 10.
    Complexidade de Algoritmos  A análise de algoritmos (complexidade do algoritmo) serve para medir a quantidade de trabalho realizada pelo algoritmo.  Essa quantidade é expressa em função de operações fundamentais, as quais variam de acordo com o algoritmo, e em funçao do volume de dados Exemplo: Exiba mensagem inicial; Abra arquivo X; Crie arquivo Xbis; Enquanto (not FinalArquivo X ) faça: { Leia w em X; Escreva w em Xbis; } Feche X; Feche Xbis. Operações fundamentais? Leia w e/ou Escreva w
  • 11.
    Operações primitivas ou fundamentais  Atribuição de valor a uma variável;  Chamada de métodos  Operações aritméticas;  Comparação de dois números;  Acesso a um elemento de um array  Retorno de um método  ..... 
  • 12.
    Análise de Algoritmos  Que dados usar?  dados reais: verdadeira medida do custo de execução  dados aleatórios: assegura-nos que as experiências testam o algoritmo e não apenas os dados específicos – Caso médio  dados perversos: mostram que o algoritmo funciona com qualquer tipo de dados. – Pior caso!  dados benéficos: – Melhor caso
  • 13.
    Dados de entrada:Pior caso  Por que é importante estudar o pior caso na análise de algoritmos?  ele é um limite superior, nunca vai ser pior do que isso!  Ele ocorre com bastante frequência em alguns algoritmos (pesquisa de um item em uma lista sendo que o item não se encontra na lista)  Muitas vezes o caso médio é tão ruim quanto o pior caso.
  • 14.
    Medida do Tempode Execução de um Programa • O projeto de algoritmos é fortemente influenciado pelo estudo de seus comportamentos. • Depois que um problema é analisado e decisões de projeto são finalizadas, é necessário estudar as várias opções de algoritmos a serem utilizados, considerando os aspectos de tempo de execução e espaço ocupado. • Muitos desses algoritmos são encontrados em áreas como pesquisa operacional, otimização, teoria dos grafos, estatística, probabilidades, entre outras.
  • 15.
    Análise: Crescimento de Funções  O tempo de execução geralmente dependente de um único parâmetro N  ordem de um polinômio  tamanho de um arquivo a ser processado, ordenado, etc, ou,  medida abstrata do tamanho do problema a considerar (usualmente relacionado com o número de dados a processar)  Quando há mais de um parâmetro  procura-se exprimir todos os parâmetros em função de um só  faz-se uma análise em separado para cada parâmetro
  • 16.
    Análise: Crescimento de Funções  Os Algoritmos têm tempo de execução proporcional a 1 - muitas instruções são executadas uma só vez ou poucas vezes (se isto for verdade para todo o programa diz-se que o seu tempo de execução é constante) logN - tempo de execução é logarítmico (cresce ligeiramente à medida que N cresce) (quando N duplica log N aumenta mas muito pouco; apenas duplica quando N aumenta para N^2) N - tempo de execução é linear. Típico quando algum processamento é feito para cada dado de entrada. Situação ótima quando é necessário processar N dados de entrada, ou produzir N dados na saída.
  • 17.
    Análise: Crescimento de Funções Nlog N - típico quando se reduz um problema em sub-problemas, se resolve estes separadamente e se combinam as soluções (se N é 1 milhão N log N é perto de 20 milhões) N2 - tempo de execução quadrático (típico quando é preciso processar todos os pares de dados de entrada) (prático apenas em pequenos problemas, ex: produto matriz - vetor) N3 - tempo de execução cúbico (para N = 100, N^3 = 1 milhão, ex: produto de matrizes) 2N - tempo de execução exponencial (provavelmente de pouca aplicação prática; típico em soluções de força bruta) (para N = 20, 2^N = 1 milhão; N duplica, tempo passa a ser o quadrado)
  • 18.
    Tamanho de problemasque podem ser resolvidos Seja n a quantidade de dados que um algoritmo pode processar. Esse algoritmo demora f(n) microssegundos (µs) para resolver o problema. A tabela apresenta o maior tamanho n de um problema que pode ser resolvido no tempo t=1 segundo e tempo =1 minuto. f(n) 1 segundo 1 minuto Math ERROR: ln(n) < 3 * 10^100 Muito grande! n 1000000 60000000 n2 1000 7700 2n 20 26 n! 10 11
  • 19.
    Notação "O grande"  Notação matemática que nos permite suprimir detalhes na análise de algoritmos  g(n)=O(f(n)) g(n) é da ORDEM de f(n) c0.f(n) é um limite superior para g(n) a partir de um valor n0
  • 20.
    Notação "O grande"  Definição: uma função g(N) diz-se ser O(f(N)) se existem constantes c0 e N0 tais que g(N) < c0 f(N) para qualquer N > N0  A notação é usada com três objetivos: 1. limitar o erro que é feito ao ignorar os termos menores nas fórmulas matemáticas 2. limitar o erro que é feito na análise ao desprezar parte de um programa que contribui de forma mínima para o custo/complexidade total 3. permitir-nos classificar algoritmos de acordo com limites superiores no seu tempo de execução.
  • 21.
    Forma para determinaçãode complexidade  Suponha o seguinte código for (i = 0; i < N; i++) { instruções; } contabilização do número de instruções é simples: N iterações e em cada uma são executadas um numero constante de instruções: O(N)  Suponha o código seguinte: for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { instruções; } } contabilização do número de instruções é ainda simples: loop interno é O(N) e é executado N vezes: O(N2)
  • 22.
    Como melhorar o desempenho?  Se existe um algoritmo A de ordem O(n)=n e outro B de ordem O(n)=n! então é preferível utilizar A.  Se não temos ou conhecemos o algoritmo apropriado? Usar técnicas de projeto de algoritmos
  • 23.
    Técnicas de Projetode Algoritmos  Dividir para conquistar (Divide-and- Conquer)  Programação dinámica (otimização)  Procura ganânciosa-gulosa (Greedy - otimização)  Branch-and-bound ( Pruning)  Aprendizagem (Machine Learning)  Aleatórios (Randomized)  Procura exaustiva ou força bruta (Brute Force ou Backtraking)
  • 24.
    Técnicas de Projeto  Dividir para conquistar (Divide-and- Conquer)  Resolver um problema grande pode ser muito difícil, mas resolver dois problemas menores pode se tornar significativamente mais simples  Divide o problema em problemas menores e resolve cada um de uma forma independente  Combina as soluções de todos os subproblemas para obter a solução do problema original  A etapa de recombinação das soluções é normalmente crítica e dispendiosa em termos de tempo
  • 25.
    Técnicas de projetode Alg.  Programação dinâmica (otimização)  Uma série de escolhas deve ser feita para atingir a solução ótima  A medida que as escolhas são realizadas surgem subproblemas da mesma forma, que podem aparecer repetidamente.  A idéia é guardar a solução para cada um desses subproblemas.  Tempo exponencial pode ser transformado em polinomial
  • 26.
    Técnicas de projetode Alg.  Procura ganânciosa (Greedy, otimização)  Muitos algoritmos têm procedimentos iterativos e escolhem em cada iteração um número de possíveis alternativas  Escolhe as alternativas mais atrativas, algumas podem levar à solução, outras não.  Pode não levar à solução correta
  • 27.
    Técnicas de projetode Alg.  Procura exaustiva ou força bruta (Brute Force)  O algoritmo examina todas as alternativas possíveis para encontrar uma solução particular.  Pode não encontrar uma solução em tempo útil, mas garante que a encontra  Branch-and-bound ( Pruning)  Ignora um conjunto de alternativas desnecessárias  Menor tempo de execução e garante que encontra a solução
  • 28.
    Técnicas de Projeto  Aprendizagem (Machine Learning) Baseiam a sua estratégia na análise computacional de dados previamente colecionados  Aleatórios (Randomized) Em cada passo pode ser atirada uma moeda ao ar para decidir o passo seguinte Existem problemas práticos onde estes algoritmos são competitivos relativamente aos algoritmos determinísticos
  • 29.
    Referências  CORMEN, T.H et al. Algoritmos: Teoria e prática. 2a Ed. Campus, RJ, 2002.  FREITAS, Ana Teresa. Análise de Algoritmos. Material didático (.pdf), INESC-ID/IST, 2005.