Centro de
Cincias
Aplicadas
e Educao
Algoritmos Avanados
Anlise de Complexidade
COMPLEXIDADE DE ALGORITMOS
Definio:
A Complexidade de um Algoritmo
consiste na quantidade de trabalho necessria
para a sua execuo, expressa em funo das
operaes fundamentais, as quais variam de
acordo com o algoritmo, e em funo do volume
de dados
COMPLEXIDADE DE ALGORITMOS
Um
Tempo de execuo de
LIN em A
Tempo de execuo de
BIN em B
16
8 ns
100.000 ns
64
32 ns
150.000 ns
256
128 ns
200.000 ns
1024
512 ns
250.000 ns
Tempo de execuo de
LIN em A
Tempo de execuo de
BIN em B
16
8 ns
100.000 ns
64
32 ns
150.000 ns
256
128 ns
200.000 ns
1024
512 ns
250.000 ns
...
...
...
1.048.576
524.288 ns
500.000 ns
4.194.304
2.097.152 ns
550.000 ns
16.777.216
8.388.608 ns
600.000 ns
...
63,072 x 1012
...
31,536 x 1012 ns ou 1 ano
...
1.375.000 ns ou cerca de
1,4 segundos5
COMPLEXIDADE DE ALGORITMOS
Pode-se
Em
COMPLEXIDADE DE ALGORITMOS
Existem
Melhor Caso
Caso Mdio
Pior Caso
Nas
Abordagem otimista!
Baseia-se
Abordagem pessimista!
A NOTAO O
Tempo
A NOTAO O
Desprezar
Interesse
assinttico
12
CLCULO DA COMPLEXIDADE
Foi
Complexidade
f(n)
O(f(n))
c x f(n)
O(f(n))
f(n) + f(n)
O(f(n))
f(n) + g(n)
O(max(f(n),g(n))
f(n) x g(n)
O(f(n) x g(n))
CLCULO DA COMPLEXIDADE:
ALGORITMO ITERATIVO
void FloidWarshall(int dist[][]) {
int i;
int j;
int k;
for ( k = 0; k < n; k++ ) {
for ( i = 0; i < n; i++ ) {
for ( j = 0; j < n; j++ ) {
int a = dist[i][j];
int b = dist[j][k];
int c = dist[k][j];
dist[i][j] = min(a, b + c );
3
}
}
3
}
}
1+1+1+n*(n*(n*(1+1+1+3)))
3+n*n* n*6
3 + 6n
O(n )
1+
1+
1+
n*(
n*(
n*(
1+
1+
1+
3
)
)
)
1+
1+
1
CLCULO DA COMPLEXIDADE:
ALGORITMO RECURSIVO
A
Complexidade da base
Complexidade do ncleo
Profundidade da recurso
Nmero de vezes que o procedimento recursivo invocado
Depende do tamanho do problema e da taxa de reduo do
tamanho do problema
justamente em sua determinao que reside o
problema!
15
CLCULO DA COMPLEXIDADE:
ALGORITMO RECURSIVO
int fatorial( int n
if( n == 0 )
return
} else {
return
}
}
) {
{
1; //Base
n * fatorial( n 1 );
// Ncleo
Tanto
Logo,
16
ORDENS DE ALGORITMOS
Complexidade
Constante
Complexidade Linear
Complexidade Logartmica
Complexidade Log Linear
Complexidade Quadrtica
Complexidade Cbica
Complexidade Exponencial
Complexidade Fatorial
{
realiza alguma operao em tempo constante
em tempo constante
}
else
{
realiza alguma operao em tempo constante
}
}
COMPLEXIDADE LOGARTMICA - O
(LOGN)
Ocorre
COMPLEXIDADE QUADRTICA O
(N)
Itens
void bubbleSort(int[] a) {
for (int i = 0; i < a.length-1; i++) {
for (int j = 0; j < a.length-1; j++) {
if (a[j] > a[j+1]) {
swap(a, j, j+1);
}
}
}
}
int dist[N][N];
int i, j, k;
for ( k = 0; k < N; k++ )
for ( i = 0; i < N; i++ )
for ( j = 0; j < N; j++ )
dist[i][j] = min( dist[i][j], dist[i][k] +
dist[k][j] );
COMPLEXIDADE EXPONENCIAL O
(2N)
Utilizao
25
ORDENS DE COMPLEXIDADE
Imagine
O(n)
Log(n)
nLog(n)
O(n2)
O(n3)
O(2n)
16
0.016s
0.004s
0.064s
0.256s
4s
32
0.032s
0.005s
0.16s
1s
33s
512
0.512s
0.009s
4.608s
4m22s
37h
O(n!)
1023 sec
...
26
Existem,
um problema de Multiplicao de 2
matrizes N X N.
A soluo trivial tem complexidade O(n3);
Este
29
Se
31