Professional Documents
Culture Documents
BE + EEC + EINF
Pedro Melo Pinto + UTAD
2011-2012 .
Algoritmia
2011/2012
Bioengenharia
Engenharia Electrotcnica e de Computadores
Engenharia Informtica
Pedro Melo-Pinto
( pmelo@utad.pt )
2011-2012 .
Algoritmia
anlise de algoritmos
2011-2012 .
Algoritmia
anlise de algoritmos
2011-2012 .
Correco
Diz-se que um algoritmo correcto se, para cada entrada, termina com a sada (ou
resultado) correcta, resolvendo deste modo o problema computacional em causa.
Um algoritmo incorrecto pode no parar com algumas entradas,
ou faz-lo mas com uma sada incorrecta.
2011-2012 .
Eficcia
2011-2012 .
Eficcia
2011-2012 .
Anlise de um Algoritmo
2011-2012 .
Anlise de um Algoritmo
Teste empricos.
Anlise aproximada.
2011-2012 .
Anlise de um Algoritmo
2011-2012 .
Anlise de um Algoritmo
2011-2012 .
Anlise de um Algoritmo
2011-2012 .
Anlise de um Algoritmo
13
2011-2012 .
EXEMPLO
Imagem digital
14
2011-2012 .
EXEMPLO
Imagem digital
15
2011-2012 .
EXEMPLO
Imagem digital
77
77
77
255
255
255
77
77
77
255
255
255
77
77
77
255
255
255
178
178
178
178
178
178
178
178
178
16
2011-2012 .
EXEMPLO
Imagem digital
17
2011-2012 .
EXEMPLO
#include <stdio.h>
return(0);
}
18
2011-2012 .
EXEMPLO
19
2011-2012 .
20
2011-2012 .
EXEMPLO
EXEMPLO
#include <stdio.h>
#define NLINES 1024
#define NCOLUMNS 1024
void ler_imagem(int[][],int,int);
main()
{
int i,j,img[NLINES][NCOLUMNS];
Eficcia ?
ler_imagem(img,NLINES,NCOLUMNS);
for(i=1;i<NLINES-1;i++)
for(j=1;j<NCOLUMNS-1;j++)
img[i][j]=(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+
img[i][j-1]+img[i][j]+img[i][j+1]+
img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])/9;
return(0);
}
10
21
2011-2012 .
EXEMPLO
#include <stdio.h>
ler_imagem(img,NLINES,NCOLUMNS);
for(i=1;i<NLINES-1;i++)
for(j=1;j<NCOLUMNS-1;j++)
img[i][j]=(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+
img[i][j-1]+img[i][j]+img[i][j+1]+
img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])/9;
return(0);
}
22
2011-2012 .
EXEMPLO
#include <stdio.h>
#define NLINES 1024
#define NCOLUMNS 1024
void ler_imagem(int[][],int,int);
main()
{
int i,j,img[NLINES][NCOLUMNS];
ler_imagem(img,NLINES,NCOLUMNS);
for(i=1;i<NLINES-1;i++)
for(j=1;j<NCOLUMNS-1;j++)
img[i][j]=(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+
img[i][j-1]+img[i][j]+img[i][j+1]+
convoluo
= 8 operaes de adio e uma de diviso
img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])/9;
return(0);
}
11
23
2011-2012 .
EXEMPLO
#include <stdio.h>
return(0);
}
24
2011-2012 .
EXEMPLO
#include <stdio.h>
#define NLINES 1024
#define NCOLUMNS 1024
void ler_imagem(int[][],int,int);
main()
{
int i,j,img[NLINES][NCOLUMNS];
ler_imagem(img,NLINES,NCOLUMNS);
for(i=1;i<NLINES-1;i++)
for(j=1;j<NCOLUMNS-1;j++)
img[i][j]=(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+
este ciclo efectuado NLINES-2 vezes
img[i][j-1]+img[i][j]+img[i][j+1]+
img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])/9;
return(0);
}
12
25
2011-2012 .
EXEMPLO
#include <stdio.h>
return(0);
}
26
2011-2012 .
EXEMPLO
#include <stdio.h>
#define NLINES 1024
#define NCOLUMNS 1024
void ler_imagem(int[][],int,int);
main()
{
int i,j,img[NLINES][NCOLUMNS];
ler_imagem(img,NLINES,NCOLUMNS);
for(i=1;i<NLINES-1;i++)
for(j=1;j<NCOLUMNS-1;j++)
Noimg[i][j]=(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+
total so efectuadas 8*(NLINES-2)*(NCOLUMNS-2) somas
eimg[i][j-1]+img[i][j]+img[i][j+1]+
(NLINES-2)*(NCOLUMNS-2) divises
img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])/9;
return(0);
}
13
27
2011-2012 .
EXEMPLO
#include <stdio.h>
return(0);
}
28
2011-2012 .
Ordenao
EXEMPLO
14
29
2011-2012 .
Ordenao
EXEMPLO
30
2011-2012 .
Ordenao
EXEMPLO
15
31
2011-2012 .
Ordenao
EXEMPLO
32
2011-2012 .
Ordenao
EXEMPLO
16
33
2011-2012 .
Ordenao
EXEMPLO
34
2011-2012 .
Ordenao
EXEMPLO
depende do ordenamento
anterior dos dados
17
35
2011-2012 .
Ordenao
custo
nvezes
c1
c2
c4
c5
n-1
n-1
ti
c6
c7
(ti-1)
(ti-1)
c8
EXEMPLO
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
36
2011-2012 .
Ordenao
for(i=1;i<n;i++)
{
aux = v[i];
j = i;
while(j>0 && v[j-1]>aux)
{
v[j] = v[j-1];
j = j - 1;
}
v[j] = aux;
}
}
EXEMPLO
custo
nvezes
c1
c2
c4
c5
n-1
n-1
ti
c6
c7
c8
(ti-1)
(ti-1)
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
18
37
2011-2012 .
Ordenao
custo
nvezes
c1
c2
c4
c5
n-1
n-1
ti
c6
c7
(ti-1)
(ti-1)
c8
EXEMPLO
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
38
2011-2012 .
Ordenao
for(i=1;i<n;i++)
{
aux = v[i];
j = i;
while(j>0 && v[j-1]>aux)
{
v[j] = v[j-1];
j = j - 1;
}
v[j] = aux;
}
}
EXEMPLO
custo
nvezes
c1
c2
c4
c5
n-1
n-1
ti
c6
c7
c8
(ti-1)
(ti-1)
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
19
39
2011-2012 .
Ordenao
custo
nvezes
c1
c2
c4
c5
n-1
n-1
ti
c6
c7
c8
EXEMPLO
(ti-1)
(ti-1)
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
Pior caso
(o vector est inversamente ordenado)
40
2011-2012 .
for(i=1;i<n;i++)
{
aux = v[i];
j = i;
while(j>0 && v[j-1]>aux)
{
v[j] = v[j-1];
j = j - 1;
}
v[j] = aux;
}
custo
nvezes
c1
c2
c4
c5
n-1
n-1
ti
c7
c8
(ti-1)
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
Pior caso
(o vector est inversamente ordenado)
20
41
2011-2012 .
custo
nvezes
for(i=1;i<n;i++)
c1
n
{
aux = v[i];
c2
n-1
j = i;
c4
n-1
mais simples ordenar uma sequncia j (total ou parcialmente)
ordenada
while(j>0 && v[j-1]>aux)
c5
ti
{
v[j] = v[j-1];
c6
(ti-1)
j = j - 1;
c7
(ti-1)
ordenar
poucos elementos mais fcil do que ordenar muitos
}
v[j] = aux;
c8
n-1
}
}
(ti o n de vezes
que o ciclo while
executado para cada i)
Pior caso
(o vector est inversamente ordenado)
42
2011-2012 .
custo
nvezes
caso-pior: (normalmente)
T(n) = tempo mximo de execuo de um algoritmo para
for(i=1;i<n;i++)
c1 n. n
qualquer entrada de tamanho
{
aux = v[i];
c2
n-1
j = i;
c4
n-1
while(j>0 && v[j-1]>aux)
c5
ti
{
v[j] = v[j-1];
c6
(ti-1)
j = j - 1;
c7
(ti-1)
(necessita} que se assuma uma distribuio estatstica das entradas de
v[j] = aux;
c8
n-1
anda geralmente perto do caso-pior
modo a modelarmos a entrada mdia)
}
}
(ti o n de vezes
que o ciclo while
executado para cada i)
Pior caso
(o vector est inversamente ordenado)
caso-melhor: (ilusrio)
T(n) = tempo de execuo - rpido - de um algoritmo para
alguma(s) entrada(s).
21
43
2011-2012 .
custo
nvezes
c1
c6
c7
(ti-1)
(ti-1)
Anlise assimpttica:c8
n-1
44
2011-2012 .
Notao assimpttica
Big Omicron
for(i=1;i<n;i++)Notao-O (limite
{
aux = Die
v[i];
Paul Bachmann.
analytische
Zahlentheorie
j = i; (1894)
while(j>0 && v[j-1]>aux)
{
v[j] = v[j-1];
j = j - 1;
}
v[j] = aux;
}
}
custo
superior):c1
nvezes
c2
n-1
Edmund Landau,
Handbuch der Lehre von
der Primzahlen (1909).
c4der Verteilungn-1
c5
ti
c6
c7
c8
(ti-1)
(ti-1)
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
Pior caso
(o vector est inversamente ordenado)
origem
22
45
2011-2012 .
Big Omicron
Notao assimpttica
custo
nvezes
Pior caso
(o vector est inversamente ordenado)
46
2011-2012 .
Big Omega
Notao assimpttica
custo
nvezes
Pior caso
(o vector est inversamente ordenado)
23
47
2011-2012 .
Big Theta
Notao assimpttica
custo
nvezes
Pior caso
(o vector est inversamente ordenado)
48
2011-2012 .
custo
nvezes
c1
c2
c4
c5
n-1
n-1
Crescimento de funes
for(i=1;i<n;i++)
{
aux = v[i];
j = i;
while(j>0 && v[j-1]>aux)
{
v[j] = v[j-1];
j = j - 1;
}
v[j] = aux;
}
}
ti
c6
c7
c8
(ti-1)
(ti-1)
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
Pior caso
(o vector est inversamente ordenado)
24
49
2011-2012 .
50
2011-2012 .
1 min
1 hora
1 dia
1 ms
1 ano
1 sc
lg n
sqrt n
n
n lg n
n2
n3
2n
n!
25
51
2011-2012 .
1 min
1 hora
1 dia
1 ms
1 ano
1 sc
1,00E+12
3,60E+15
1,30E+19
7,50E+21
6,75E+24
1,00E+27
1,00E+31
1,00E+06
6,00E+07
3,60E+09
8,64E+10
2,59E+12
3,15E+13
3,15E+15
n lg n
lg n
>1E300
sqrt n
62800
2,80E+06
1,30E+08
1000
7746
60000
293939
1,61E+06
5,62E+06
5,62E+07
100
391
1532
4420
13736
31593
146645
20
25
31
36
41
44
51
n!
11
12
13
15
16
17
n
n
52
2011-2012 .
Ordenao
EXEMPLO
custo
nvezes
c1
c5
ti
c6
c7
(ti-1)
(ti-1)
c8
n-1
(tmaior
n de vezes
i o ordem.
(neste contexto) S vamos considerar o termo de
Pior caso
Tambm
vamos ignorar
o coeficiente
(o vector
est inversamente
ordenado)
26
53
2011-2012 .
Ordenao
for(i=1;i<n;i++)
{
aux = v[i];
j = i;
while(j>0 && v[j-1]>aux)
{
v[j] = v[j-1];
j = j - 1;
}
v[j] = aux;
}
EXEMPLO
custo
nvezes
c1
c5
ti
c6
c7
(ti-1)
(ti-1)
c8
T(n) = O(n2)
n-1
(ti o n de vezes
que o ciclo while
executado para cada i)
Pior caso
(o vector est inversamente ordenado)
54
2011-2012 .
Ordenao
EXEMPLO
custo
nvezes
c1
ti
c6
c7
(ti-1)
(ti-1)
c8
n-1
}
(ti o n de vezes
Habitualmente
considera-se um algoritmo mais eficaz
do que outro, se o
que o ciclo while
tempo de execuo do seu caso-pior tem uma ordemexecutado
de crescimento
menor.
para cada
i)
Pior caso
Devido s constantes e aos termos
(o vector est inversamente ordenado)
27