Complexidade de Algoritmos, Notação assintótica, Algoritmos� polinomiais e intratáveis

jfrjunio 9,958 views 50 slides Nov 17, 2014
Slide 1
Slide 1 of 50
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50

About This Presentation

Complexidade de Algoritmos;Notação assintótica; Algoritmos �polinomiais e intratáveis


Slide Content

http://www.icmc.usp.br/pessoas/junio
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
Introdução
Algoritmos e funções
Notação Assintótica – Interpretação
matemática
Notação Assintótica – Aplicação a algoritmos
Notação Assintótica – Interpretação
algorítmica
Notação Assintótica – Limitações
Notação Assintótica – Um indicador geral
Algoritmos Polinomiais e Exponenciais
Conclusões

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.

http://www.icmc.usp.br/pessoas/junio
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++){
contador++;
}
}
 n passos para terminar

http://www.icmc.usp.br/pessoas/junio
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++;
}
}
}
 n*n passos para terminar

http://www.icmc.usp.br/pessoas/junio
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++;
}
}
}
}
 n*n*n passos para terminar

http://www.icmc.usp.br/pessoas/junio
Algoritmos e Funções
Algoritmo1Algoritmo2Algoritmo3
n = 1 1 1 1
n = 10 10 10
2
10
3
n = 100010
3
10
6
10
9
n = 10
6
10
6
10
12
10
18
f(n) = nf(n) = n
2
f(n) = n
3

http://www.icmc.usp.br/pessoas/junio
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
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
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
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
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) ≤ c
1
*g(n) para uma
constante c
1
> 0 e para n ≥ n
0
n
0

http://www.icmc.usp.br/pessoas/junio
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) ≥ c
1
*g(n) para uma
constante c
1
> 0 e para n ≥ n
0

http://www.icmc.usp.br/pessoas/junio
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 c
1
*g(n) ≤ f(n) ≤ c
2
*g(n)
para um constantes c
1 e
c
2
> 0 e para n ≥ n
0

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica – Interpretação
matemática
Principais limites assintóticos:
O(1) < O(logn) < O(n) < O(nlogn) < O(n
2
) < O(2
n
)

http://www.icmc.usp.br/pessoas/junio
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
Notação Assintótica
Aplicação a algoritmos
AlgForcaBruta(int n){
soma = 0
for(i = 1 to n)
soma = soma + i
}
1
n
n
 Custo total: 1 + n + n = 2n + 1
 f(n) = 2n + 1

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Aplicação a algoritmos
AlgInstataneo(int n){
soma = n*(n+1)/2
}
4
 Custo total: 4
 f(n) = 4

http://www.icmc.usp.br/pessoas/junio
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) = n
2
+ n +1

http://www.icmc.usp.br/pessoas/junio
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) = n
2
+ n +1

http://www.icmc.usp.br/pessoas/junio
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
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
Notação Assintótica
Aplicação a algoritmos
O AlgBobo tem complexidade
f(n) = q(g(n))= q(n
2
) , isto é, g(n) = n
2
Mas por quê, se f(n) = n
2
+ n + 1?
R.: segundo a definição de limite assintótico estrito
c1*g(n) ≤ f(n) ≤ c2*g(n) temos:
1* n
2
≤ f(n) = n
2
+ n + 1 ≤ 2* n
2

http://www.icmc.usp.br/pessoas/junio
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) = n
2
+ n +1 = q(n
2
)
Analisando-se o que a notação assintótica define,
verificam-se dois fatos:

http://www.icmc.usp.br/pessoas/junio
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
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)
h(n)
lim
n¥
= 0
Ex.: f(n) = n
2
> h(n) = n
para n = 10
10
, temos n = 10
10
= 0
n
2
10
100
~

http://www.icmc.usp.br/pessoas/junio
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
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
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 n
2
2) ordenar uma seqüência totalmente embaralhada
o Quicksort tem custo n*logn
como n
2
é o pior que o Quicksort pode fazer, ele
terá sempre
f(n) ≤ n
2
 O(n
2
)

http://www.icmc.usp.br/pessoas/junio
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
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 n
2
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
Notação Assintótica
Interpretação algorítmica
• Limite assintótico estrito: q(g(n))
Indica que não importam quais as circunstâncias,
c
1
g(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
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
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 n
2
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
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) 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 dizer:
“q(n
2
) 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”

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) e W(n)
1)já ordenada  custo n
2)em ordem inversa  custo n
2
3)toda embaralhada  custo n + d

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) 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 dizer:
“q(n
2
) 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”
1)já ordenada  custo n
2)em ordem inversa  custo n
2
3)toda embaralhada  custo n + d

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) 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 dizer:
“q(n
2
) 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”
1)já ordenada  custo n
2)em ordem inversa  custo n
2
3)toda embaralhada  custo n + d

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) 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 dizer:
“q(n
2
) 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”
1)já ordenada  custo n
2)em ordem inversa  custo n
2
3)toda embaralhada  custo n + d

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) 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 dizer:
“q(n
2
) 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”

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) 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 dizer:
“q(n
2
) 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”

http://www.icmc.usp.br/pessoas/junio
Notação Assintótica
Interpretação algorítmica
•Para o Insertion-sort valem as seguintes afirmações:
•ele é, ao mesmo tempo, O(n
2
) 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 dizer:
“q(n
2
) 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”
Intuição geral:
• 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

http://www.icmc.usp.br/pessoas/junio
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 n
2
= q(n
2
)
e outro algoritmo tem complexidade 100n = q(n)
 entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n
2
≤ 100n, para n ≤ 100

http://www.icmc.usp.br/pessoas/junio
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 n
2
= q(n
2
)
e outro algoritmo tem complexidade 100n = q(n)
 entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n
2
≤ 100n, para n ≤ 100

http://www.icmc.usp.br/pessoas/junio
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 n
2
= q(n
2
)
e outro algoritmo tem complexidade 100n = q(n)
 entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n
2
≤ 100n, para n ≤ 100

http://www.icmc.usp.br/pessoas/junio
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 n
2
= q(n
2
)
e outro algoritmo tem complexidade 100n = q(n)
 entradas de tamanho até 100, é melhor usar o
primeiro algoritmo, pois n
2
≤ 100n, para n ≤ 100
É preciso conhecer bem o problema que se
tem, para que se possa fazer uma boa
escolha.

http://www.icmc.usp.br/pessoas/junio
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
Algoritmos Polinomiais e
Exponenciais

http://www.icmc.usp.br/pessoas/junio
Algoritmos Polinomiais e
Exponenciais
Suponha-se um algoritmo com ordem O(2
n
)
 para n = 100
 um computador que realiza 2
12
operações/segundo
 tempo total: 4*10
10
anos!!!

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