análise e projeto de algoritmos - ic.uff.brloana/apa-0.pdf · prof: loana t. nogueira análise e...
TRANSCRIPT
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 - 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).
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).