Análise e Projeto de Algoritmos - ic.uff.brloana/apa-0.pdf · PROF: LOANA T. NOGUEIRA Análise e...

33
PROF: LOANA T. NOGUEIRA Análise e Projeto de Algoritmos

Transcript of Análise e Projeto de Algoritmos - ic.uff.brloana/apa-0.pdf · PROF: LOANA T. NOGUEIRA Análise e...

P R O F : L O A N A T . N O G U E I R A

Análise e Projeto de Algoritmos

Desenvolvimento de Algoritmos

 Introdução:

 Dado um problema, como encontramos um algoritmo eficiente para sua solução?

Desenvolvimento de Algoritmos

 Introdução:

 Dado um problema, como encontramos um algoritmo eficiente para sua solução?

 Encontrado um algoritmo, como comparar este algoritmo com outros algoritmos que solucionam o mesmo problema?

Desenvolvimento de Algoritmos

 Introdução:

 Dado um problema, como encontramos um algoritmo eficiente para sua solução?

 Encontrado um algoritmo, como comparar este algoritmo com outros algoritmos que solucionam o mesmo problema?

 Como deveríamos julgar a qualidade de um algoritmo?

Desenvolvimento de Algoritmos

 Introdução:

 Dado um problema, como encontramos um algoritmo eficiente para sua solução?

 Encontrado um algoritmo, como comparar este algoritmo com outros algoritmos que solucionam o mesmo problema?

 Como deveríamos julgar a qualidade de um algoritmo?  Qual é o algoritmo de menor custo possível para resolver um

problema particular?

Desenvolvimento de Algoritmos

 Introdução:

 Dado um problema, como encontramos um algoritmo eficiente para sua solução?

 Encontrado um algoritmo, como comparar este algoritmo com outros algoritmos que solucionam o mesmo problema?

 Como deveríamos julgar a qualidade de um algoritmo?  Qual é o algoritmo de menor custo possível para resolver um

problema particular?

O que é um algoritmo?

 Um algoritmo pode ser visto como uma sequência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema

O que é um algoritmo?

 Um algoritmo pode ser visto como uma sequência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema

Corresponde a uma descrição de um padrão de comportamento, expresso em termos de um conjunto finito de ações.

Dijkstra

O que é um algoritmo?

 Um algoritmo pode ser visto como uma sequência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema

É, em geral, uma descrição passo a passo de como um problema é solucionável. A descrição deve ser finita, e os passos bem definidos, sem ambiguidades, e executá- veis computacionalmente.

Medidas de Complexidade

 Como selecionar um algoritmo quando existem vários que solucionam o problema?

Medidas de Complexidade

 Como selecionar um algoritmo quando existem vários que solucionam o problema?

 Soluções:   Escolher um algoritmo de fácil entendimento codificação e

depuração  Escolher um algoritmo que faz uso eficiente dos recursos do

computador

Análise de Complexidade de Algoritmos

 Meados dos anos 60: tempos de execução de um programa que implementava um algoritmo - Os resultados encontrados dependiam:  Do computador utilizado  Do compilador utilizado

  Atualmente: análise de um algoritmo compreende dois passos:  Análise prévia: a qual determina a função que delimita o

tempo de computação do algoritmo  Coleta de estatísticas reais sobre o algoritmo

Análise de Complexidade de Algoritmos

 Finalidades:

 Dá oportunidade de se projetar novas maneiras de se fazer uma mesma tarefa de um modo mais rápido

 Obter estimativas de tempos de execução de programas que implementam um algoritmo. A complexidade do algoritmo dá idéia do esforço computacional do programa, que é uma medida do número de operações executadas pelo programa.

Complexidade de Algoritmos

 Complexidade: é o número de vezes que as instruções preponderantes são executadas

 Veremos a notação O, Omega e Theta

Notação O

 Maneira de classificar um determinada “coisa”ou comportamento segundo um conjunto de padrões estabelecidos.

 Ex.: Aos sermos apresentados à uma pessoa, sem nos darmos conta, nós a classificamos por base de alguns esteriótipos nossos (fulano é do tipo “certinho”, hippie, descansado, ideal, outros). Com certeza a pessoa não se encaixará em um dos nossos tipos, mas, nós a classificamos segundo o maior número de características que mais se adequam em um tipo.

Notação O

 A complexidade de um algoritmo depende da quantidade de dados que são processados e isso se traduz pelo tamanho da entrada, pelos seus valores e pela configuração dos dados

 Ex.: O que pensar ao ver uma expressão do tipo

 n+10  n2+1

Notação O

 A complexidade de um algoritmo depende da quantidade de dados que são processados e isso se traduz pelo tamanho da entrada, pelos seus valores e pela configuração dos dados

 Ex.: O que pensar ao ver uma expressão do tipo

 n+10  n2+1

Pensamos em valores pequenos de n, valores

próximos de zero

Notação O

 A complexidade de um algoritmo depende da quantidade de dados que são processados e isso se traduz pelo tamanho da entrada, pelos seus valores e pela configuração dos dados

 Ex.: O que pensar ao ver uma expressão do tipo

 n+10  n2+1

A análise de algoritmos ignora os valores pequenos e

concentra-se nos valores enormes de n

Notação O

Para valores enormes de n, as funções

n2, (3/2)n2, 9999n2, n2/10000, n2+100n, etc.

Crescem com a mesma velocidade e portanto são todas “equivalentes”.

Notação O

Para valores enormes de n, as funções

n2, (3/2)n2, 9999n2, n2/10000, n2+100n, etc.

Crescem com a mesma velocidade e portanto são todas “equivalentes”.

Esse tipo de matemática, interessada somente em valores enormes de n, é chamada assintótica.

Notação O

Nessa matemática, as funções são classificadas em “ordens”, todas as funções de uma mesma ordem são “equivalentes”.

Notação O

 Convém restringir a atenção a funções assintoticamente não-negativas, ou seja, funções f tais que f(n) ≥ 0 para todo n suficientemente grande.

Notação O

 Convém restringir a atenção a funções assintoticamente não-negativas, ou seja, funções f tais que f(n) ≥ 0 para todo n suficientemente grande.

f é assintoticamente não-negativa se existe n0 tal que f(n) ≥ 0 para todo

n ≥ n0.

Notação O

 Def: Dadas funções assintoticamente não-negativas f e g, dizemos que f está na ordem O de g, e escrevemos f=O(g), ou f ∈ O(g), se f(n) ≤ c.g(n) para algum c positivo e para todo n suficientemente grande.

Notação O

 Def: Dadas funções assintoticamente não-negativas f e g, dizemos que f está na ordem O de g, e escrevemos f=O(g), ou f ∈ O(g), se f(n) ≤ c.g(n) para algum c positivo e para todo n suficientemente grande.

∃ c, n0 positivos tais que f(n) ≤ c.g(n), ∀ n ≥ n0.

Notação O

 Def: Dadas funções assintoticamente não-negativas f e g, dizemos que f está na ordem O de g, e escrevemos f=O(g), ou f ∈ O(g), se f(n) ≤ c.g(n) para algum c positivo e para todo n suficientemente grande.

 Neste caso, dizemos que g(n) domina assintoticamente f(n), ou que g(n) é um limite assintoticamente superior para f(n).

∃ c, n0 positivos tais que f(n) ≤ c.g(n), ∀ n ≥ n0.

Notação O

 Graficamente:

g(n)

f(n)

n0

Notação O - Exemplos

 Seja g(n) = 4n2 e f(n) = 100n. Mostre que g domina assintoticamente f.

Notação O - Exemplos

 Seja g(n) = 4n2 e f(n) = 100n. Mostre que g domina assintoticamente f.

 Solução:

Para qualquer valor de n ≥25 e para c=1 temos que |100n|≤|4n2|. Ou seja, com c =1 e n=25 temos que a definição de domínio assintótico é satisfeita, g(n) domina assintoticamente f(n).

Notação O - Exemplos

 Seja g(n) = 4n2 e f(n) = 100n. Mostre que g domina assintoticamente f.

 Solução:

Para qualquer valor de n ≥25 e para c=1 temos que |100n|≤|4n2|. Ou seja, com c =1 e n=25 temos que a definição de domínio assintótico é satisfeita, g(n) domina assintoticamente f(n).

g(n) atua como um limite superior para f(n)

Notação O - Exemplos

 Seja g(n) = n2 e f(n) = 2n2+3n +4. Mostre que g domina assintoticamente f.

 Seja g(n) = n0 e f(n) = 3+ 2/n. Mostre que g domina assintoticamente f.

 Suponha que g(n) = 200n2 e f(n) = n3. Mostre que f∉ O(g(n)).

Notação O - Teorema

 Se A(n)= Amnm+... + A1n + A0 é um polinômio de grau m, então A(n) é O(nm).

Notação O - Teorema

 Se A(n)= Amnm+... + A1n + A0 é um polinômio de grau m, então A(n) é O(nm).

 Exemplo: Se f(n) = n3 + 2n2 + n +1 , podemos dizer que este algoritmo tem complexidade O(n3). Isto significa que para valores muito grandes de n, poderíamos desconsiderar a outra parte do polinômio (2n2+n+1), pois ela não influenciaria tanto no crescimento de f(n).