complexidade-1x2

Upload: cristiano-da-silva

Post on 06-Jul-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/17/2019 complexidade-1x2

    1/9

    7. Introdução à Complexidade de Algoritmos

    Fernando Silva

    DCC-FCUP

    Estruturas de Dados

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 1 / 1

    Análise de Algoritmos

    No desenvolvimento de algoritmos é importante ter a noção da eficiênciade um algoritmo, i.e. da eficiência que pode ter uma implementação doalgoritmo.

    Eficiência normalmente mede-se em  tempo de execução  ou  espaço 

    (memória) necessário à execução do algoritmo (ou programaassociado).

    Tempo de Execução de um algoritmo varia com o input enormalmente aumenta com o tamanho do input. caso médio é difícil de determinar. normalmente, olha-se para o pior caso possível de tempo de execução:

    mais simples de analizar

    crucial nas aplicações mais exigentes, jogos, etc.

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 2 / 1

  • 8/17/2019 complexidade-1x2

    2/9

    Como aferir a eficiência

    Como aferir a eficiência, por exemplo, o tempo de execução?

    Análise empírica – executando o programa com inputs de tamanho e

    composição variados, mas nem sempre é simples concretizar o algoritmo, ou os resultados podem não ser conclusivos, comparação de algoritmos obriga a usar igual software e hardware.

    Análise teórica usa uma descrição de mais alto nível do algoritmo em vez da

    implementação, caracteriza o tempo de execução como uma função do tamanho do

    input, n, tem em conta todos os possíveis inputs, permite avaliar eficiência de forma independente do ambiente de

    hardware/software.

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 3 / 1

    Exemplo de análise de complexidade - findMax()

    Como calcular o tempo de execução do algoritmo seguinte:

    Pressupostos (RAM -Random Access Memory):

    memória ilimitada e endereços contêm um no arbitrário ou caracteres,aceder ao conteúdo de um endereço custa uma unidade de tempo.

     max= A[0]; → 1 leitura de  A[0] + 1 atribuição a  max.Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 4 / 1

  • 8/17/2019 complexidade-1x2

    3/9

    Determinar complexidade do findMax()

    Casos possíveis:

    caso mais favorável (A[0] é o maior elemento):t (n) = 2 + 1 + n + 4(n − 1) + 1 = 5n operações primitivaspior caso:t (n) = 2 + 1 + n + 6(n − 1) + 1 = 7n − 2caso médio? difícil de calcular, depende da distribuição do input; usarteoria de probabilidades.

    Normalmente, olharemos para o pior caso, pois dá-nos um limite superiordo tempo de execução.

    Cálculo do tempo de execução:

    seja  a  o tempo observado para a operação primitiva mais rápida

    seja  b  o tempo observado para a operação primitiva mais lenta

    então, o pior tempo de execução  T (n) seráa (7n − 2) ≤ T (n) ≤ b (7n − 2) ⇒ T (n) limitado por 2 funções lineares

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 5 / 1

    Taxa de crescimento do tempo de execução

    Saliente-se que:

    o tempo de execução,  T (n), pode ser afectado pela alteração doambiente hardware/software, mas

    tal não acontece se considerarmos a taxa de crescimento de  T (n)

    A taxa de crescimento de  T (n)  correspondeao crescimento de  T (n) quando se aumenta o valor de  n.

    O exemplo  findMax()

    mostrava  T (n) limitado por 2 funções lineares em  n, significando queo tempo de execução varia na mesma proporção que  n.

    Logo, diz-se que o crescimento de  T (n) é linear.

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 6 / 1

  • 8/17/2019 complexidade-1x2

    4/9

    Taxas de crescimento (1)

    logarítmica   ≈ log2 nlinear   ≈ nquadrática

      ≈n2

    cúbica   ≈ n3polinomial   ≈ nk exponencial   ≈ a n(a  > 1)

    Crescimento de algumas funções:n   log2 n

    √ n n n log2 n n

    2 n3 2n

    2 1 1.4 2 2 4 8 48 3 2.8 8 24 64 512 256

    16 4 4.0 16 64 256 4096 65536. . . . . . . . . . . . . . . . . . . . . . . .

    1024 10 32 1024 10240   > 106 > 109 > 10308

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 7 / 1

    Taxas de crescimento (2)

    Se assumirmos que cada operação pode ser executada em 1µs  (micro-sec),qual será o maior problema (função de  n) para um programa que executeem 1 seg., 1 min., 1 hora?

    Tamanho máximo problema (n)

    T (n)   1 seg. 1 min. 1 hora  400n   2500 150,000 9,000,00020nlog n   4096 166,666 7,826,087

    2n2 707 5,477 42,426n4 31 88 2442n 19 25 31

    No caso de crescimento exponencial, apenas conseguimos tratar problemaspara dimensões muito pequenas de  n.

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 8 / 1

  • 8/17/2019 complexidade-1x2

    5/9

    A definição “big-Oh” O()Definição de ordem de complexidade assimptótica:

    Sejam   f   (n) e  g (n) funções de  N0 −→ R.f   (n)  é

     O(g (n)) (ou seja,   f   (n) é da ordem de  g (n))

    se ∃c  > 0, ∃n0 ≥ 1 :  f   (n) ≤ cg (n), ∀n ≥ n0Interpretação gráfica:

    O(g (n)) corresponde ao limitesuperior da taxa de crescimento def   (n).

    dizer que   f   (n) é O(g (n)), significadizer que   f   (n) não cresce mais do queg (n).

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 9 / 1

    Exemplos - O()2n + 10 é O(n)porque:

    2n + 10

    ≤cn

      ⇒  (c 

    −2)n

    ≥10

      ⇒  n

      10

    (c 

    − 2)para  c  = 3 e  n0  = 10 verifica-se sempre que 2n + 10 ≤ cnoutras funções:

    20n3 + 10n log n + 5 —   O(n3)a k n

    k  + a k −1nk −1 + . . . + a 0   —   O(nk )

    3log n + log log n   —   O(log n)

    2100

    —   O(1)5n

      —   O( 1n

    )

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 10 / 1

  • 8/17/2019 complexidade-1x2

    6/9

    Regras de simplificação

    Algumas regras que olhando para expressões mais complexas,permitem-nos fazer simplificações:

    Se  d (n) ∼ O(f   (n)), então  ad (n) (com  a  >  0) ∼ O(f   (n))Se  d (n) ∼ O(f   (n)) e  e (n) ∼ O(g (n)), então  d (n) + e (n) ∼ O(f   (n) + g (n))

    Se  d (n) ∼ O(f   (n)) e  e (n) ∼ O(g (n)), então  d (n)e (n) ∼ O(f   (n)g (n))

    Se  d (n) ∼ O(f   (n)) e   f   (n) ∼ O(g (n)), então  d (n) ∼ O(g (n))

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 11 / 1

    Complexidade do método da bolha (bubble-sort)

    Façamos a análise de complexidade do método da bolha:

    Efectivamente, o número de iterações total é a soma das iterações que ociclo  j faz para cada valor de  i, i.e.

    n−1i =1 (n − i ) = (n − 1) + (n − 2) + . . . + 2 + 1 =

    =   n(n−1)2   =  n2

    2 −   n2 ⇒ O(n2)Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 12 / 1

  • 8/17/2019 complexidade-1x2

    7/9

    Complexidade de funções recursivas

    Considere-se a função factorial  fact() e seja  T (n) o tempo de execuçãopara  fact(n), então:

    ∴ T (n) =

    c  + T (n − 1),   se  n > 1d ,   se  n ≤ 1

    assumindo  n ≥ 2:   T (n − 1) = c  + T (n − 2) ⇒ T (n) = 2c  + T (n − 2)em geral:   T (n) = ic  + T (n − i ), n >  i se   i  = n − 1, então  T (n) = c (n − 1) + T (1) = c (n − 1) + d donde podemos concluir  T (n) ≈ O(n), i.e.   fact() tem complexidade  n.

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 13 / 1

    Complexidade da pesquisa binária (1)

    Considere-se o método  pesqbin() (pesquisa binária não recursiva):

    Inicialmente o intervalo de valores é  n (e  = 0 e  d  = n − 1). Em cadapasso do ciclo, o intervalo reduz-se a metade.Portanto, a questão que se coloca é:

    dado um inteiro  n, quantas divisões inteiras por 2 são necessárias paraque chegue a 1? i.e. qual dos valores seguintes será o primeiro a ser  

  • 8/17/2019 complexidade-1x2

    8/9

    Complexidade da pesquisa binária (2)

    É necessário resolver a equação:   n/2k   log2 n

    Podemos então dizer que: com  k  = log2 n sabemos que ao fim de um máximo de  k   iterações,

    encontramos o valor ou podemos concluir que o valor que procuramosnão existe.

    Em resumo, dizemos que a função  pesqbin() tem complexidadelogarítmica, O(log2 n), pois o número de iterações necessárias nãoexcede log

    2 n, sendo  n a dimensão dos dados.

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 15 / 1

    Complexidade de árvores binárias de pesquisa (1)

    Ver primeiro capítulo sobre árvores!

    Se inserirmos  n valores aleatórios numa árvore binária de pesquisa,sabemos que

    o comprimento médio do caminho da raíz até uma folha é O(log2 n) –correspondente à profundidade da árvore.

    verificar se  x  pertence à árvore é assim O(log2 n)Se a árvore for completa, então nenhum caminho da raíz até um dadonó pode ter mais do que 1 + log2 n  nós. métodos  insertBTNode(),  contains() e  removeBTNode() são

    O(log2 n).É comum que ao inserirmos  n valores aleatórios, a árvore não seja

    completa, pode até ficar uma sequência ordenada. Neste caso cadainserção é O(n).

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 16 / 1

  • 8/17/2019 complexidade-1x2

    9/9

    Complexidade de árvores binárias de pesquisa (2)

    A questão a saber é se uma árvore binária em média estará próxima de uma árvore

    completa ou de uma sequência? isto decide se o tempo médio é O(log2 n) ou O(n).

    A demonstração deste resultado é complexa, envolvendoprobabilidades, basta-nos aqui saber que é possível mostrar porindução que a complexidade será O(log2 n).

    Fernando Silva (DCC-FCUP) 7. Introdução à Complexidade de Algoritmos Estruturas de Dados 17 / 1