Você está na página 1de 25

1

COMPLEXIDADE DE ALGORITMOS
Algoritmos
Seqncia de instrues necessrias para a
resoluo de um problema bem formulado
Permite implementao computacional
COMPLEXIDADE DE ALGORITMOS
Um algoritmo resolve o problema quando para
qualquer entrada produz uma resposta correta
Mesmo resolvendo um problema, um algoritmo
pode no ser aceitvel na prtica por requerer
muito espao e tempo
Um problema considerado INTRATVEL, se
no existe um algoritmo para ele cuja demanda
de recursos computacionais seja razovel.
2
COMPLEXIDADE DE ALGORITMOS
Questes
O problema em questo tratvel?
Existe um algoritmo que demande
quantidade razovel de recursos
computacionais?
Quais os custos deste algoritmo?
Existe um algoritmo melhor?
Como comparar algoritmos?
COMPLEXIDADE DE ALGORITMOS
! ... ! 3 ! 2 ! 1 n + + + +
Exerccio:
3
COMPLEXIDADE DE ALGORITMOS
Estas e outras questes so abordadas em uma
rea de conhecimento denominada
Anlise de complexidade
de algoritmos
COMPLEXIDADE DE ALGORITMOS
O custo final de um algoritmo pode estar
relacionado a diversos fatores:
- Tempo de execuo
- Utilizao de memria principal
- Utilizao de disco
- Consumo de energia, etc...
Medidas importantes em outros contextos:
- legibilidade do cdigo
- custo de implementao
- portabilidade
- extensibilidade
4
COMPLEXIDADE DE ALGORITMOS
Exemplo:
Soluo de um sistema de equaes lineares
AX = 0
Mtodos:
Cramer (determinantes)
Gauss (escalonamento)
COMPLEXIDADE DE ALGORITMOS
Estimativa emprica de tempo, para um processador
rodando em 3GHz
n Cramer Gauss
2 4 ns 2 ns
3 12 ns 8 ns
4 48 ns 20 ns
5 240ns 40 ns
10 7.3ms 330 ns
20 152 anos 2.7 ms
Em maioria dos casos, complexidade em tempo
preocupao principal
5
COMPLEXIDADE DE ALGORITMOS
Outro exemplo
- Busca seqencial
- Dado um vetor de nmeros, verificar se um
nmero chave encontra-se neste vetor
char achou = 0;
i = 0;
while (!achou && i<n) {
achou = (vet[i] == chave);
i++;
}
if (achou) return(i);
else return(1);
COMPLEXIDADE DE ALGORITMOS
Outro exemplo
- Busca seqencial
Neste caso no existe um nmero fixo de
operaes!
Isto vai depender de onde o valor chave
encontrado
Por isso, comum realizar a contagem para:
- O melhor caso
- O pior caso
- E o caso mdio
6
TEMPO DE EXECUO DE ALGORTMOS
Um algoritmo pode rodar mais rpido para
certos conjunto de dados do que para
outros.
Encontrar um caso mdio pode ser muito
difcil, assim os algoritmos so geralmente
medidos pela complexidade de tempo do
pior caso.
TEMPO DE EXECUO DE ALGORTMOS
Alm disso, para certas reas de aplicao (controle de
trfego area, cirurgias, etc.), o conhecimento da
complexidade do pior caso crucial.
7
COMPLEXIDADE DE ALGORITMOS
Anlise de Complexidade de tempo
- Anlise Experimental
- Anlise Terica
COMPLEXIDADE DE ALGORITMOS
Complexidade de tempo:
Pode ser medida empiricamente:
Com funes para o clculo do tempo. Exemplo:
#include <time.h>
time_t t1,t2;
time(&t1);
/*Operaes*/
time(&t2);
double diferenca = difftime(t2,t1);
//diferena em segundos
8
TEMPO DE EXECUO DE ALGORTMOS
Estudo experimental
- escreva um programa que implemente o
algoritmo;
- execute o programa com conjuntos de dados
de vrios tamanhos e composies;
- use um mtodo para medir o tempo de
execuo com exatido;
- os resultados devem ser parecidos com este
TEMPO DE EXECUO DE ALGORTMOS
Estudos experimentais possuemvrias limitaes:
- preciso implementar e testar o algoritmo para
determinar seu tempo de execuo;
- os experimentos s podem ser feito para um conjunto
limitado de dados de entrada, assimos tempos de
computao resultantes podem no ser indicativos
dos tempos de execuo para entradas no includas
no experimento;
- para comparar dois algoritmos, devem ser utilizados
o mesmo ambiente de hardware e software.
9
TEMPO DE EXECUO DE ALGORTMOS
iremos agora apresenta um metodologia geral para
analisar o tempo de computao de algoritmos que
- utiliza a descrio de algoritmos em alto-nvel ao
invs de testar uma de suas implementaes
- leva em considerao todas as possveis entradas;
- permite avaliar a eficincia de qualquer algoritmo
de uma maneira que independente dos
ambientes de hardware e software.
COMPLEXIDADE DE ALGORITMOS
Uma boa idia estimar a eficincia de um
algoritmo em funo do tamanho do problema
- Em geral, assume-se que n o tamanho do
problema, ou nmero de elementos que sero
processados
- E calcula-se o nmero de operaes que sero
realizadas sobre os n elementos
10
ANLISE ASSINTTICA
Deve-se preocupar com a eficincia de algoritmos
quando o tamanho de n for grande
Definio: a eficincia assinttica de um algoritmo
descreve a eficincia relativa dele quando n torna-
se grande
Portanto, para comparar 2 algoritmos, determinam-
se as taxas de crescimento de cada um: o algoritmo
com menor taxa de crescimento rodar mais rpido
quando o tamanho do problema for grande
1) Escreve o algoritmo em pseudo-cdigo;
2)Conta operaes primitivas (computaes
de baixo nvel que podem ser consideras em
tempo constante de execuo);
3) Anlise a complexidade do algoritmo
usando a notao Big-Oh.
Procedimento
ANLISE ASSINTTICA
11
Algumas notaes
Notaes que usaremos na anlise de algoritmos
f(n) = O(g(n)) (l-se big-oh, big-o ou da ordem de)
se existirem constantes c e n
0
tal que f(n) c*g(n)
quando n n
0
- A taxa de crescimento de f(n) menor ou igual taxa de g(n)
f(n) = (g(n)) (l-se mega) se existirem
constantes c e n
0
tal que f(n) c*g(n) quando n n
0
- A taxa de crescimento de f(n) maior ou igual taxa de g(n)
Algumas notaes
Notaes que usaremos na anlise de algoritmos
f(n) = (g(n)) (l-se theta) se e somente se f(n) =
O(g(n)) e f(n) = (g(n))
- A taxa de crescimento de f(n) igual taxa de g(n)
12
13
Algumas consideraes
Ao dizer que T(n) = O(f(n)), garante-se que T(n) cresce
numa taxa no maior do que f(n), ou seja, f(n) seu limite
superior
Ao dizer que T(n) = (f(n)), tem-se que f(n) o limite
inferior de T(n).
Exemplos
Se f(n)=n
2
e g(n)=2n
2
, ento essas duas funes tm
taxas de crescimento iguais. Portanto, f(n) = O(g(n)) e f(n)
= (g(n))
14
Taxas de crescimento
Algumas regras
Se T
1
(n) = O(f(n)) e T
2
(n) = O(g(n)), ento
T
1
(n) + T
2
(n) = max(O(f(n)), O(g(n)))
T
1
(n) * T
2
(n) = O(f(n) * g(n))
Se T(x) um polinmio de grau n, ento
T(x) = O(x
n
)
Tempo constante: O(1) (raro)
Tempo sublinear (log(n)): muito rpido (timo)
Tempo linear: (O(n)): muito rpido (timo)
Tempo nlogn: Comum em algoritmos de diviso e conquista.
Tempo polinomial n
k
: Freqentemente de baixa ordem (k
10), considerado eficiente.
Tempo exponencial: 2
n
, n!, n
n
considerados intratveis
Funes e Taxas de Crescimento
15
Funes e Taxas de Crescimento
16
17
Calculando o tempo de execuo
Supondo que as operaes simples demoram uma
unidade de tempo para executar, considere o programa
abaixo para calcular o resultado de

=
n
i
i
1
3
Incio
declare soma_parcial numrico;
soma_parcial := 0;
para i :=1 at n faa
soma_parcial := soma_parcial+i*i*i;
escreva(soma_parcial);
Fim
18
Incio
declare soma_parcial numrico;
soma_parcial := 0;
para i :=1 at n faa
soma_parcial := soma_parcial+i*i*i;
escreva(soma_parcial);
Fim
Calculando o Tempo de Execuo
1 unidade de tempo
1 unidade para inicializao
de i,
n+1 unidades para testar se
i<=n
n unidades para incrementar
i
4 unidades (1 da soma,
2 das multiplicaes e 1
da atribuio)
1 unidade para escrita
Custo total: 6n + 4 = O(n)
Calculando o Tempo de Execuo
Em geral, como se d a resposta em termos do big-oh,
costuma-se desconsiderar as constantes e elementos
menores dos clculos
No exemplo anterior
- A linha soma_parcial := 0 insignificante em termos
de tempo
- desnecessrio ficar contando 2, 3 ou 4 unidades de
tempo na linha soma_parcial := soma_parcial+i*i*i
- O que realmente d a grandeza de tempo desejada
a repetio na linha para i := 1 at n faa
19
Em geral, no consideramos os termos de ordem inferior
da complexidade de um algoritmo, apenas o termo
predominante.
Exemplo: Um algoritmo tem complexidade T(n) = 3n
2
+
100n. Nesta funo, o segundo termo tem um peso
relativamente grande, mas a partir de n
0
= 11, o termo
n
2
que "d o tom" do crescimento da funo: uma
parbola. A constante 3 tambm tem uma influncia
irrelevante sobre a taxa de crescimento da funo aps
umcerto tempo. Por isso dizemos que este algoritmo da
ordemde n
2
ou que tem complexidade O(n
2
).
Repeties
O tempo de execuo de uma repetio o
tempo dos comandos dentro da repetio
(incluindo testes) vezes o nmero de vezes
que executada
Regras para o clculo
20
Repeties aninhadas
- A anlise feita de dentro para fora
- O tempo total de comandos dentro de um grupo
de repeties aninhadas o tempo de execuo
dos comandos multiplicado pelo produto do
tamanho de todas as repeties
- O exemplo abaixo O(n
2
)
Regras para o clculo
para i := 0 at n faa
para j := 0 at n faa
faa k := k+1;
Comandos consecutivos
- a soma dos tempos de cada um bloco, o que
pode significar o mximo entre eles
- O exemplo abaixo O(n
2
), apesar da primeira
repetio ser O(n)
Regras para o clculo
para i := 0 at n faa
k := 0;
para i := 0 at n faa
para j := 0 at n faa
faa k := k+1;
21
Se... ento... seno
- Para uma clusula condicional, o tempo de
execuo nunca maior do que o tempo do teste
mais o tempo do maior entre os comandos relativos
ao ento e os comandos relativos ao seno
- O exemplo abaixo O(n)
Regras para o clculo
se i < j
ento i := i+1
seno para k := 1 at n faa
i := i*k;
Exerccio
Estime quantas unidades de tempo so
ecessrias para rodar o algoritmo abaixo
Incio
declare i e j numricos;
declare A vetor numrico de n posies;
i := 1;
enquanto i <= n faa
A[i] := 0;
i := i+1;
para i := 1 at n faa
para j := 1 at n faa
A[i] := A[i]+i+j;
Fim
22
Chamadas a sub-rotinas
Uma sub-rotina deve ser analisada primeiro
e depois ter suas unidades de tempo
incorporadas ao programa/sub-rotina que a
chamou
Regras para o clculo
Sub-rotinas recursivas
- Anlise de recorrncia
- Recorrncia: equao ou desigualdade que descreve
uma funo em termos de seu valor em entradas
menores
- Caso tpico: algoritmos de dividir-e-conquistar, ou
seja, algoritmos que desmembram o problema em
vrios subproblemas que so semelhantes ao problema
original, mas menores em tamanho, resolvem os
subproblemas recursivamente e depois combinam
essas solues com o objetivo de criar uma soluo
para o problema original
Regras para o clculo
23
Exemplo de uso de recorrncia
- Calculo Fatorial n!
Regras para o clculo
sub-rotina fat(n: numrico)
incio
declare aux numrico;
aux := 1
se n = 1
ento aux := 1
seno aux := n*fat(n-1);
fim
Regras para o clculo
sub-rotina fat(n: numrico)
incio
declare aux numrico;
aux := 1
se n = 1
ento aux := 1
seno aux := n*fat(n-1);
fim
T(n) = c+T(n-1)
= 2c+T(n-2)
= ...
= nc +T(1)
= O(n)
24
UMA RPIDA REVISO DE MATEMTICA
Logaritmos e Expoentes
- Propriedades de logaritmos
b a
c
c
b
b b
b b b
b b b
c c
a b
b
a
a
x x
y x y x
y x xy
log log
log
log
log
log log
log log / log
log log log
=
=
=
=
+ =

- Propriedades de expoente
( )
b c c
b
c b
c
b
bc
c
b
c b c b
a
a
a b
a b
a
a
a
a a
a a a
log
log
=
=
=
=
=

+
UMA RPIDA REVISO DE MATEMTICA
Cho (floor)
x= ao maior inteiro menor que x
Teto (ceiling)
x( = ao menor inteiro menor que x
Somatria
( ) ( ) ( ) ( ) ( ) ( ) t f t f s f s f s f i f
t
s i
+ + + + + + + =

=
1 ... 2 1
25
UMA RPIDA REVISO DE MATEMTICA
Expresses geomtricas f(i) = a
i
Dado um nmero inteiro n > 0 e um nmero real 0 < a 1,
a
a
a a a a a
n
n
n
i
i

= + + + + =
+
=

1
1
...
1
2 1 0
0
A progresso geomtrica mostra um crescimento exponencial
UMA RPIDA REVISO DE MATEMTICA
Progresses aritmticas
Um exemplo,
( )
2
1
... 3 2 1
1
+
= + + + + =

=
n n
n i
n
i
( )
|

\
|
+ + =

=
2
1
1
3
1
1
2
n n n i
n
i

Você também pode gostar