Este documento discute a complexidade de algoritmos e a notação assintótica. Apresenta como a análise de complexidade de algoritmos reduz um algoritmo a uma função matemática que representa o número de instruções executadas em função do tamanho da entrada. Explora os conceitos de limite assintótico superior, inferior e estrito e como eles são usados para classificar algoritmos de acordo com sua taxa de crescimento, ignorando constantes e termos de menor ordem.
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e intratáveis
1. Complexidade de Algoritmos:
Tempo e espaço; Notação
assintótica; Algoritmos
polinomiais e intratáveis
Professor: José Fernando Rodrigues Júnior
Universidade de São Paulo
http://www.icmc.usp.br/pessoas/junio
3. http://www.icmc.usp.br/pessoas/junio
Introdução
Porquê o estudo da Complexidade?
Escolher entre vários algoritmos o mais eficiente;
Desenvolver algoritmos mais eficientes;
Complexidade Computacional - torna possível
determinar se a definição de determinado algoritmo é
viável.
4. Algoritmos e Funções
Todo algoritmo define uma função matemática
f(n)= # de instruções
Ex.:
void Algoritmo1(int n){
int contador = 0;
for(int i = 0; I < n; I++){
http://www.icmc.usp.br/pessoas/junio
contador++;
}
}
n passos para terminar
5. Algoritmos e Funções
Todo algoritmo define uma função matemática
f(n)= # de instruções
Ex.:
void Algoritmo2(int n){
int contador = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
contador++;
http://www.icmc.usp.br/pessoas/junio
}
}
}
n*n passos para terminar
6. Algoritmos e Funções
Todo algoritmo define uma função matemática
f(n)= # de instruções
Ex.:
void Algoritmo3(int n){
int contador = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < n; k++){
contador++;
http://www.icmc.usp.br/pessoas/junio
}
}
}
}
n*n*n passos para terminar
7. Algoritmos e Funções
Algoritmo1 Algoritmo2 Algoritmo3
n = 1 1 1 1
n = 10 10 102 103
n = 1000 103 106 109
n = 106 106 1012 1018
f(n) = n f(n) = n2 f(n) = n3
http://www.icmc.usp.br/pessoas/junio
8. Algoritmos e Funções
Qual algoritmo você escolheria?
R.: basta olhar na função definida por cada
algoritmo
A função de um algoritmo melhor algoritmo para
um dado problema
Fatores: tempo de processamento, memória,
acessos a disco, largura de banda, entre outros
http://www.icmc.usp.br/pessoas/junio
9. Algoritmos e Funções
A prática de se reduzir um algoritmo a uma função
matemática denomina-se
“Análise de complexidade de algoritmos”
http://www.icmc.usp.br/pessoas/junio
10. Algoritmos e Funções
Mas como se faz a análise de um algoritmo,
matematicamente falando?
R.: Notação Assintótica: como estabelecer uma
relação de ordem entre funções matemáticas?
Funções não são números!
http://www.icmc.usp.br/pessoas/junio
11. Notação Assintótica – Interpretação
matemática
Caracterização de funções de 3 maneiras:
limites assintóticos superior, inferior e estrito
http://www.icmc.usp.br/pessoas/junio
12. Notação Assintótica – Interpretação
matemática
1) Limite assintótico superior: O(g(n))
Uma função f(n) = O(g(n)), se f(n) ≤ c1*g(n) para uma
constante c1 > 0 e para n ≥ n0
n0
http://www.icmc.usp.br/pessoas/junio
13. Notação Assintótica – Interpretação
matemática
2) Limite assintótico inferior: W(g(n))
Uma função f(n) = W(g(n)), se f(n) ≥ c1*g(n) para uma
constante c1 > 0 e para n ≥ n0
http://www.icmc.usp.br/pessoas/junio
14. Notação Assintótica – Interpretação
matemática
3) Limite assintótico estrito: q(g(n))
Uma função f(n) = q(g(n)), se c1*g(n) ≤ f(n) ≤ c2*g(n)
para um constantes c1 e c2 > 0 e para n ≥ n0
http://www.icmc.usp.br/pessoas/junio
16. Notação Assintótica
Aplicação a algoritmos
Exemplo: suponha um algoritmo para calcular a
soma de uma seqüência de números
http://www.icmc.usp.br/pessoas/junio
17. Notação Assintótica
Aplicação a algoritmos
AlgForcaBruta(int n){
soma = 0
for(i = 1 to n)
soma = soma + i
http://www.icmc.usp.br/pessoas/junio
}
1
n
n
Custo total: 1 + n + n = 2n + 1
f(n) = 2n + 1
19. Notação Assintótica
Aplicação a algoritmos
AlgBobo(int n){
soma = 0
for(i = 0 to n){
for(j = 1 to i){
soma = soma + 1
}
}
}
1
n
n((n+1)/2)
n((n+1)/2)
Custo total: 1 + n + n((n+1)/2) + n((n+1)/2)
f(n) = n2 + n +1
http://www.icmc.usp.br/pessoas/junio
20. Notação Assintótica
Aplicação a algoritmos
O que temos então:
AlgForcaBruta: f(n) = 2n + 1
AlgInstantaneo: f(n) = 4
AlgBobo: f(n) = n2 + n +1
http://www.icmc.usp.br/pessoas/junio
21. Notação Assintótica
Aplicação a algoritmos
O AlgForcaBruta tem complexidade
f(n) = q(g(n))= q(n) , isto é, g(n) = n
Mas por quê, se f(n) = 2n + 1?
R.: segundo a definição de limite assintótico estrito
c1*g(n) ≤ f(n) ≤ c2*g(n) temos:
1*n ≤ f(n) = 2n + 1 ≤ 3*n
http://www.icmc.usp.br/pessoas/junio
22. Notação Assintótica
Aplicação a algoritmos
O AlgInstantaneo tem complexidade
f(n) = q(g(n))= q(1) , isto é, g(n) = 1
Mas por quê, se f(n) = 4?
R.: segundo a definição de limite assintótico estrito
c1*g(n) ≤ f(n) ≤ c2*g(n) temos:
3*1 ≤ f(n) = 4 ≤ 5*1
http://www.icmc.usp.br/pessoas/junio
23. Notação Assintótica
Aplicação a algoritmos
O AlgBobo tem complexidade
f(n) = q(g(n))= q(n2) , isto é, g(n) = n2
Mas por quê, se f(n) = n2 + n + 1?
R.: segundo a definição de limite assintótico estrito
c1*g(n) ≤ f(n) ≤ c2*g(n) temos:
1* n2 ≤ f(n) = n2 + n + 1 ≤ 2* n2
http://www.icmc.usp.br/pessoas/junio
24. Notação Assintótica
Aplicação a algoritmos
O que temos então:
AlgForcaBruta: f(n) = 2n + 1 = q(n)
AlgInstantaneo: f(n) = 4 = q(1)
AlgBobo: f(n) = n2 + n +1 = q(n2)
Analisando-se o que a notação assintótica define,
verificam-se dois fatos:
http://www.icmc.usp.br/pessoas/junio
25. Notação Assintótica
Aplicação a algoritmos
Analisando-se o que a notação assintótica define,
verificam-se dois fatos:
1) A notação assintótica não está interessada na
função específica f(n), mas na sua taxa de
crescimento com relação a n. As constantes da
função f(n) são ignoradas.
2) Os termos de mais baixa ordem são ignorados.
http://www.icmc.usp.br/pessoas/junio
26. Notação Assintótica
Aplicação a algoritmos
Mas por quê os termos de mais baixa ordem são
ignorados?
R.: a notação considera valores de n arbitrariamente
grandes. Se f(n) < h(n), então f(n)
lim
n¥ = 0
http://www.icmc.usp.br/pessoas/junio
h(n)
Ex.: f(n) = n2 > h(n) = n
para n = 1010, temos n = 1010 = 0
n2 10100
~
27. Notação Assintótica
Interpretação algorítmica
Os limites assintóticos têm a seguinte interpretação
com relação a algoritmos.
Dado um algoritmo com função f(n)...
http://www.icmc.usp.br/pessoas/junio
28. Notação Assintótica
Interpretação algorítmica
• Limite assintótico superior: O(g(n))
Indica que não importam quais as circunstâncias,
f(n) ≤ g(n) sempre
“g(n) é o pior que o meu algoritmo pode fazer”
http://www.icmc.usp.br/pessoas/junio
29. Notação Assintótica
Interpretação algorítmica
Exemplo: algoritmo de ordenação Quicksort
Possíveis circunstâncias:
1) ordenar uma seqüência que já está em ordem
o Quicksort tem custo n2
2) ordenar uma seqüência totalmente embaralhada
o Quicksort tem custo n*logn
como n2 é o pior que o Quicksort pode fazer, ele
terá sempre
f(n) ≤ n2 O(n2)
http://www.icmc.usp.br/pessoas/junio
30. Notação Assintótica
Interpretação algorítmica
• Limite assintótico inferior: W(g(n))
Indica que não importam quais as circunstâncias,
f(n) ≥ g(n) sempre
“g(n) é o melhor que o meu algoritmo pode fazer”
http://www.icmc.usp.br/pessoas/junio
31. Notação Assintótica
Interpretação algorítmica
Exemplo: algoritmo de ordenação Quicksort
Possíveis circunstâncias:
1) ordenar uma seqüência que já está em ordem
o Quicksort demora n2
2) ordenar uma seqüência totalmente embaralhada
o Quicksort demora n*logn
como n*logn é o melhor que o Quicksort pode
fazer, ele terá sempre
f(n) ≥ n*logn W(n*logn)
http://www.icmc.usp.br/pessoas/junio
32. Notação Assintótica
Interpretação algorítmica
• Limite assintótico estrito: q(g(n))
Indica que não importam quais as circunstâncias,
c1g(n) ≤ f(n) ≤ c2g(n) sempre
“meu algoritmo não faz nem pior, nem melhor
que g(n)”
http://www.icmc.usp.br/pessoas/junio
33. Notação Assintótica
Interpretação algorítmica
Exemplo: algoritmo de ordenação Heapsort
Possíveis circunstâncias:
1) seqüência já ordenada custo n*logn
2) seqüência em ordem inversa custo n*logn
3) seqüência totalmente embaralhada custo n*logn
em todos os casos n*logn é sempre o que o meu
algoritmo faz
c1n*logn ≤ f(n) ≤ c2n*logn q(n*logn)
http://www.icmc.usp.br/pessoas/junio
34. Notação Assintótica
Interpretação algorítmica
• Pior caso, melhor caso e caso médio
Exemplo: algoritmo de ordenação Insertion-sort
Possíveis circunstâncias
1) seqüência já ordenada custo n
2) seqüência em ordem inversa custo n2
3) seqüência toda embaralhada custo n + d, tal
que d é o número de operações de rearranjo
http://www.icmc.usp.br/pessoas/junio
35. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
• ele é, ao mesmo tempo, O(n2) e W(n)
• considerando-se apenas as melhores entradas,
pode-se dizer:
“q(n) no melhor caso”
• considerando-se apenas as piores entradas, pode-se
http://www.icmc.usp.br/pessoas/junio
dizer:
“q(n2) no pior caso”
• considerando-se apenas as demais entradas, que
são a maioria mais provável, pode-se dizer:
“q(n + d) no caso médio”
36. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
• ele é, ao mesmo tempo, O(n2) e W(n)
1) já ordenada custo n
2) em ordem inversa custo n2
3) toda embaralhada custo n + d
http://www.icmc.usp.br/pessoas/junio
37. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
• ele é, ao mesmo tempo, O(n2) e W(n)
• considerando-se apenas as melhores entradas,
pode-se dizer:
“q(n) no melhor caso”
• considerando-se apenas as piores entradas, pode-se
1) já ordenada custo n
2) em ordem inversa custo n2
3) toda embaralhada custo n + d
http://www.icmc.usp.br/pessoas/junio
dizer:
“q(n2) no pior caso”
• considerando-se apenas as demais entradas, que
são a maioria mais provável, pode-se dizer:
“q(n + d) no caso médio”
38. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
• ele é, ao mesmo tempo, O(n2) e W(n)
• considerando-se apenas as melhores entradas,
pode-se dizer:
“q(n) no melhor caso”
• considerando-se apenas as piores entradas, pode-se
1) já ordenada custo n
2) em ordem inversa custo n2
3) toda embaralhada custo n + d
http://www.icmc.usp.br/pessoas/junio
dizer:
“q(n2) no pior caso”
• considerando-se apenas as demais entradas, que
são a maioria mais provável, pode-se dizer:
“q(n + d) no caso médio”
39. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
• ele é, ao mesmo tempo, O(n2) e W(n)
• considerando-se apenas as melhores entradas,
pode-se dizer:
“q(n) no melhor caso”
1) já ordenada custo n
2) em ordem inversa custo n2
3) toda embaralhada custo n + d
• considerando-se apenas as piores entradas, pode-se
http://www.icmc.usp.br/pessoas/junio
dizer:
“q(n2) no pior caso”
• considerando-se apenas as demais entradas, que
são a maioria mais provável, pode-se dizer:
“q(n + d) no caso médio”
40. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
• ele é, ao mesmo tempo, O(n2) e W(n)
• considerando-se apenas as melhores entradas,
pode-se dizer:
“q(n) no melhor caso”
• considerando-se apenas as piores entradas, pode-se
http://www.icmc.usp.br/pessoas/junio
dizer:
“q(n2) no pior caso”
• considerando-se apenas as demais entradas, que
são a maioria mais provável, pode-se dizer:
“q(n + d) no caso médio”
41. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
• ele é, ao mesmo tempo, O(n2) e W(n)
• considerando-se apenas as melhores entradas,
pode-se dizer:
“q(n) no melhor caso”
• considerando-se apenas as piores entradas, pode-se
http://www.icmc.usp.br/pessoas/junio
dizer:
“q(n2) no pior caso”
• considerando-se apenas as demais entradas, que
são a maioria mais provável, pode-se dizer:
“q(n + d) no caso médio”
42. Notação Assintótica
Interpretação algorítmica
• Para o Insertion-sort valem as seguintes afirmações:
Intuição geral:
• ele é, ao mesmo tempo, O(n2) e W(n)
• considerando-se apenas as melhores entradas,
pode-se dizer:
“q(n) no melhor caso”
• considerando-se apenas as piores entradas, pode-se
http://www.icmc.usp.br/pessoas/junio
dizer:
“q(n2) no pior caso”
• considerando-se apenas as demais entradas, que
são a maioria mais provável, pode-se dizer:
“q(n + d) no caso médio”
• quando se diz:
“um algoritmo tem complexidade x”
isso é válido para TODAS as entradas
• quando se diz:
“um algoritmo tem complexidade x em tal caso”
isso é válido para TODAS as entradas que constituem
aquele caso
43. Notação Assintótica
Limitações
• Como se pode ver, a notação assintótica tem
expressividade limitada
1) por si só, ela não apresenta dados a respeito da
qualidade da entrada
2) a notação oculta fatores importantes que podem
fazer diferença na escolha de um algoritmo
Por exemplo:
se um algoritmo tem complexidade n2 = q(n2)
e outro algoritmo tem complexidade 100n = q(n)
entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n2 ≤ 100n, para n ≤ 100
http://www.icmc.usp.br/pessoas/junio
44. Notação Assintótica
Limitações
• Como se pode ver, a notação assintótica tem
expressividade limitada
1) por si só, ela não apresenta dados a respeito da
qualidade da entrada
2) a notação oculta fatores importantes que podem
fazer diferença na escolha de um algoritmo
Por exemplo:
se um algoritmo tem complexidade n2 = q(n2)
e outro algoritmo tem complexidade 100n = q(n)
entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n2 ≤ 100n, para n ≤ 100
http://www.icmc.usp.br/pessoas/junio
45. Notação Assintótica
Limitações
• Como se pode ver, a notação assintótica tem
expressividade limitada
1) por si só, ela não apresenta dados a respeito da
qualidade da entrada
2) a notação oculta fatores importantes que podem
fazer diferença na escolha de um algoritmo
Por exemplo:
se um algoritmo tem complexidade n2 = q(n2)
e outro algoritmo tem complexidade 100n = q(n)
entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n2 ≤ 100n, para n ≤ 100
http://www.icmc.usp.br/pessoas/junio
46. Notação Assintótica
Limitações
• Como se pode ver, a notação assintótica tem
expressividade limitada
1) por si só, ela não apresenta dados a respeito da
qualidade da entrada
2) a É notação preciso oculta conhecer fatores bem o importantes problema que que se
podem
fazer tem, diferença para que na se escolha possa fazer de um uma algoritmo
boa
Por exemplo:
escolha.
se um algoritmo tem complexidade n2 = q(n2)
e outro algoritmo tem complexidade 100n = q(n)
entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n2 ≤ 100n, para n ≤ 100
http://www.icmc.usp.br/pessoas/junio
47. Notação Assintótica
Um indicador geral
• Usada para indicar os requisitos de qualquer fator
que creça como uma função de n. Os principais
são:
• tempo, como já visto
• o espaço de memória
• o número de acessos a disco
• a largura de banda
http://www.icmc.usp.br/pessoas/junio
49. Algoritmos Polinomiais e
Exponenciais
Suponha-se um algoritmo com ordem O(2n)
para n = 100
um computador que realiza 212 operações/segundo
tempo total: 4*1010 anos!!!
http://www.icmc.usp.br/pessoas/junio
50. http://www.icmc.usp.br/pessoas/junio
Conclusões
• A análise de complexidade depende da
compreensão de dois fatores:
• interpretação matemática
• interpretação algorítmica
• Deve-se sempre lembrar que existem outras
dimensões envolvidas na análise, como qualidade
da entrada e arquitetura computacional
• A análise assintótica fornece um bom parâmetro,
mas não deve ser o único a ser considerado