Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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
Exerccio:
1 ! + 2 ! + 3 ! + ... + n !
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
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
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
area,
cirurgias,
etc.),
conhecimento
da
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
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
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 tornase grande
Portanto, para comparar 2 algoritmos, determinamse as taxas de crescimento de cada um: o algoritmo
com menor taxa de crescimento rodar mais rpido
quando o tamanho do problema for grande
ANLISE ASSINTTICA
Procedimento
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.
10
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 n0 tal que f(n) c*g(n)
quando n n0
- A taxa de crescimento de f(n) menor 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)
11
12
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)=n2 e g(n)=2n2, ento essas duas funes tm
taxas de crescimento iguais. Portanto, f(n) = O(g(n)) e f(n)
= (g(n))
13
Taxas de crescimento
Algumas regras
Se T1(n) = O(f(n)) e T2(n) = O(g(n)), ento
T1(n) + T2(n) = max(O(f(n)), O(g(n)))
T1(n) * T2(n) = O(f(n) * g(n))
Se T(x) um polinmio de grau n, ento
T(x) = O(xn)
14
15
16
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
17
Incio
declare soma_parcial numrico;
soma_parcial := 0;
soma_parcial := soma_parcial+i*i*i;
4 unidades (1 da soma,
2 das multiplicaes e 1
da atribuio)
escreva(soma_parcial);
Fim
18
19
20
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
21
22
T(n) = c+T(n-1)
= 2c+T(n-2)
= ...
= nc +T(1)
= O(n)
23
log b a =
log c a
log c b
b log c a = a log c b
a b+ c = a b a c
(a )
b c
= a bc
ab
= a bc
ac
b = a log a b
b c = a c log a b
f (i ) = f (s ) + f (s + 1) + f (s + 2) + ... + f (t 1) + f (t )
i=s
24
1 a
i =0
n
i = 1 + 2 + 3 + ... + n =
i =1
n
i
i =1
n(n + 1)
2
1
1
= n(n + 1) n +
3
2
25