Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
2. Análise assintótica
Ao ver uma expressão como n + 10 ou n2
+ 1,
pensamos geralmente em valores pequenos de n,
valores próximos de zero.
A análise de algoritmos faz exatamente o contrário:
ignora os valores pequenos e concentra-se nos
valores enormes de n. Esse tipo de análise
chama-se análise “assintótica”.
– p. 2/35
3. Análise assintótica - exemplo
Considere o número de operações de dois
algoritmos que resolvem um mesmo problema,
como função do tamanho n da entrada.
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.)
– p. 3/35
4. Análise assintótica - exemplo
Nosso interesse é estudar o comportamento
assint´otico das funções, ou seja, quando n → ∞.
Em geral, os termos inferiores e as constantes
multiplicativas contribuem pouco na comparação e
podem ser descartados.
– p. 4/35
5. Análise assintótica - exemplo
O importante é observar que f1(n) tem crescimento
proporcional a n2
(quadrático), ao passo que f2(n)
tem crescimento proporcional a n (linear). Um
crescimento quadrático é pior que um crescimento
linear. Assim, vamos preferir o Algoritmo 2.
– p. 5/35
6. Análise assintótica - outro exemplo
Para valores enormes de n, as funções
n2
,
3
2
n2
, 9999n2
,
n2
1000
, n2
+ 100n
crescem todas com a mesma velocidade e
portanto são todas “equivalentes”. Nesse estudo,
as funções são classificadas em “ordens”; todas as
funções de uma mesma ordem são equivalentes.
As cinco funções acima, por exemplo, pertencem à
mesma ordem.
– p. 6/35
7. Importância da análise assintótica
Na tabela abaixo, os valores representam o
tamanho da maior instância solucionável em uma
hora.
Computador Computador 100 Computador 1000
Função atual vezes mais rápido vezes mais rápido
n N 100N 1000N
n log n N1 22, 5N1 140, 2N1
n2 N2 10N2 31, 6N2
n3
N3 4, 6N3 10N3
2n N4 N4 + 6 N4 + 10
– p. 7/35
8. Funções assintoticamente não negativas
Restringiremos 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”.
Mais explicitamente, f é assintoticamente não
negativa se existe n0 tal que f(n) ≥ 0 para todo n
maior que n0.
– p. 8/35
10. Ordem O
Dadas funções assintoticamente não negativas f e
g, dizemos que f est´a na ordem O de g e
escrevemos f = O(g) se
f(n) ≤ c.g(n)
para algum c positivo e para todo n suficientemente
grande.
– p. 10/35
11. Ordem O
Em outras palavras, f = O(g) se existe um número
positivo c e um número n0 tais que
f(n) ≤ c.g(n)
para todo n maior que n0.
– p. 11/35
12. Ordem O - Exemplos
A notação O fornece limites superiores de funções
que, por sua vez, correspondem a tempos de
execução de algoritmos.
– p. 12/35
13. Ordem O - Exemplos
A notação O fornece limites superiores de funções
que, por sua vez, correspondem a tempos de
execução de algoritmos.
Exemplo 1: Se f(n) ≤ 9999g(n) para todo n ≥ 1000
– p. 12/35
14. Ordem O - Exemplos
A notação O fornece limites superiores de funções
que, por sua vez, correspondem a tempos de
execução de algoritmos.
Exemplo 1: Se f(n) ≤ 9999g(n) para todo n ≥ 1000
então f = O(g).
– p. 12/35
15. Ordem O - Exemplos
Exemplo 2: Suponha que f(n) = 2n2
+ 3n + 4.
– p. 13/35
16. Ordem O - Exemplos
Exemplo 2: Suponha que f(n) = 2n2
+ 3n + 4.
2n2
+ 3n + 4 ≤ 2n2
+ 3n2
+ 4n2
= 9n2
para todo n ≥ 1.
– p. 13/35
17. Ordem O - Exemplos
Exemplo 2: Suponha que f(n) = 2n2
+ 3n + 4.
2n2
+ 3n + 4 ≤ 2n2
+ 3n2
+ 4n2
= 9n2
para todo n ≥ 1. Portanto, f(n) = O(n2
).
– p. 13/35
18. Ordem O - Exemplos
Exemplo 3: Suponha que f(n) = 3 + 2
n e que
g(n) = 1.
– p. 14/35
19. Ordem O - Exemplos
Exemplo 3: Suponha que f(n) = 3 + 2
n e que
g(n) = 1. Então
3 +
2
n
≤ 3 + 1 = 4 = 4.g(n)
para todo n ≥ 2.
– p. 14/35
20. Ordem O - Exemplos
Exemplo 3: Suponha que f(n) = 3 + 2
n e que
g(n) = 1. Então
3 +
2
n
≤ 3 + 1 = 4 = 4.g(n)
para todo n ≥ 2. Portanto, f(n) = O(g(n)) = O(1).
– p. 14/35
21. Ordem O - Exemplos
Exemplo 4: Suponha que f(n) = n3
e que
g(n) = 200n2
. Será verdade que f(n) = O(g(n))?
– p. 15/35
22. Ordem O - Exemplos
Exemplo 4: Suponha que f(n) = n3
e que
g(n) = 200n2
. Será verdade que f(n) = O(g(n))?
Se existem c e n0 tais que f(n) ≤ c.g(n), teremos
n ≤ 200c
para todo n ≥ n0. Mas isso é absurdo!
– p. 15/35
23. Ordem O - Exemplos
Exemplo 4: Suponha que f(n) = n3
e que
g(n) = 200n2
. Será verdade que f(n) = O(g(n))?
Se existem c e n0 tais que f(n) ≤ c.g(n), teremos
n ≤ 200c
para todo n ≥ n0. Mas isso é absurdo!
Logo, f(n) = O(g(n)).
– p. 15/35
25. Ordem O - Exercícios
9. Seja n
k o número de combinações de n objetos
tomados k a k. Mostre n
2 = O(n2).
Prove os disprove as afirmações:
10. 2n+1 = O(2n)
11. 3n = O(2n)
12. log2 n = O(log3 n)
13. log3 n = O(log2 n)
14. log2 n = O(n)
15. 100 log n − 10n + 2n log n = O(n log n)
– p. 17/35
26. Limite superior (upper bound)
A notação O também é utilizada para indicar
limites superiores para problemas.
– p. 18/35
27. Limite superior (upper bound)
A notação O também é utilizada para indicar
limites superiores para problemas.
Dado um problema, por exemplo, o de
multiplicação de duas matrizes quadradas n × n.
– p. 18/35
28. Limite superior (upper bound)
A notação O também é utilizada para indicar
limites superiores para problemas.
Dado um problema, por exemplo, o de
multiplicação de duas matrizes quadradas n × n.
Conhecemos um algoritmo para resolver este
problema (pelo método trivial) de complexidade
O(n3
).
– p. 18/35
29. Limite superior
Sabemos assim que a complexidade deste
problema não deve superar O(n3
), uma vez que
existe um algoritmo que o resolve com esta
complexidade, e dizemos que uma cota superior ou
limite superior para este problema é O(n3
).
– p. 19/35
30. Limite superior
Sabemos assim que a complexidade deste
problema não deve superar O(n3
), uma vez que
existe um algoritmo que o resolve com esta
complexidade, e dizemos que uma cota superior ou
limite superior para este problema é O(n3
).
A cota superior de um problema pode mudar se
alguém descobrir um outro algoritmo melhor.
– p. 19/35
31. Limite superior
V. Strassen apresentou em 1969 um algoritmo
para multiplicação de matrizes de complexidade
O(nlog 7
) = O(n2.807
).
– p. 20/35
32. Limite superior
V. Strassen apresentou em 1969 um algoritmo
para multiplicação de matrizes de complexidade
O(nlog 7
) = O(n2.807
).
Assim a cota superior para o problema de
multiplicação de matrizes passou a ser O(nlog 7
).
– p. 20/35
33. Limite superior
Em 1990, Coppersmith e Winograd melhoraram
esta marca para O(n2.376
);
– p. 21/35
34. Limite superior
Em 1990, Coppersmith e Winograd melhoraram
esta marca para O(n2.376
);
Em 2010, A. Stothers apresentou um algoritmo
de complexidade O(n2.373
);
– p. 21/35
35. Limite superior
Em 1990, Coppersmith e Winograd melhoraram
esta marca para O(n2.376
);
Em 2010, A. Stothers apresentou um algoritmo
de complexidade O(n2.373
);
Em 2011, V. Willians melhorou ainda mais esta
marca para O(n2.372
).
– p. 21/35
36. Limite superior
Em 1990, Coppersmith e Winograd melhoraram
esta marca para O(n2.376
);
Em 2010, A. Stothers apresentou um algoritmo
de complexidade O(n2.373
);
Em 2011, V. Willians melhorou ainda mais esta
marca para O(n2.372
).
Portanto, a cota superior atual para o problema da
multiplicação de matrizes é O(n2.372
).
– p. 21/35
37. Analogia com record mundial
A cota superior para um problema é análoga ao
record mundial de uma modalidade de atletismo.
Ele é estabelecido pelo melhor atleta (algoritmo)
do momento. Assim como o record mundial, a cota
superior pode ser melhorada por um algoritmo
(atleta) mais veloz.
– p. 22/35
38. Analogia com record mundial
“Cota superior” - 100m. rasos
1988 Carl Lewis 9s 92
1993 Linford Christie 9s 87
1999 Maurice Greene 9s 79
2007 Asafa Powell 9s 74
2008 Usain Bolt 9s 72
2009 Usain Bolt 9s 58
– p. 23/35
39. Limite inferior (lower bound)
As vezes é possível demonstrar que, para um dado
problema, qualquer que seja o algoritmo a ser
usado, o problema requer pelo menos um certo
número de operações.
– p. 24/35
40. Limite inferior (lower bound)
As vezes é possível demonstrar que, para um dado
problema, qualquer que seja o algoritmo a ser
usado, o problema requer pelo menos um certo
número de operações.
Essa complexidade é chamada cota inferior (lower
bound) do problema.
– p. 24/35
41. Limite inferior
Para o problema da multiplicação de matrizes
quadradas n × n, apenas para ler os elementos
das duas matrizes de entrada ou para produzir os
elementos da matriz produto leva tempo O(n2
).
Assim uma cota inferior trivial é Ω(n2
).
– p. 25/35
42. Algoritmo ótimo
Se um algoritmo tem uma complexidade igual á
cota inferior do problema, ele é assintoticamente
´otimo ou simplesmente ´otimo.
– p. 26/35
44. Ordem Ω
A expressão “f = O(g)” tem o mesmo sabor que
“f ≤ g”. Agora precisamos de um conceito que
tenha o sabor de “f ≥ g”.
– p. 28/35
45. Ordem Ω
Dadas funções assintoticamente não negativas f e
g, dizemos que f est´a na ordem Ω de g e
escrevemos f = Ω(g) se
f(n) ≥ c.g(n)
para algum c positivo e para todo n suficientemente
grande.
– p. 29/35
46. Ordem Ω
Em outras palavras, f = Ω(g) se existe um número
positivo c e um número n0 tais que
f(n) ≥ c.g(n)
para todo n maior que n0.
– p. 30/35
47. Ordem Ω
Em outras palavras, f = Ω(g) se existe um número
positivo c e um número n0 tais que
f(n) ≥ c.g(n)
para todo n maior que n0.
Qual a relação entre O e Ω?
– p. 30/35
48. Ordem Ω
Em outras palavras, f = Ω(g) se existe um número
positivo c e um número n0 tais que
f(n) ≥ c.g(n)
para todo n maior que n0.
Qual a relação entre O e Ω?
f = O(g) ⇔ g = Ω(f)
– p. 30/35
49. Ordem Ω - Exercícios
1. Seja n
k o número de combinações de n objetos
tomados k a k. Mostre n
2 = Ω(n2).
2. Prove que 100 log n − 10n + 2n log n está em Ω(n log n).
3. É verdade que 2n + 1 está em Ω(n)?
– p. 31/35
51. Ordem Θ
Além dos conceitos que têm o sabor de “f ≤ g” e
de “f ≥ g”, precisamos de um que tenha o sabor
de “f = g.
– p. 33/35
52. Ordem Θ
Dizemos que as funções f e g estão na mesma
ordem e escrevemos f = Θ(g) se f = O(g) e
f = Ω(g).
Em outras palavras, f = Θ(g) significa que existe
números positivos c e d tais que
c.g(n) ≤ f(n) ≤ d.g(n)
para todo n suficientemente grande.
– p. 34/35