Escolar Documentos
Profissional Documentos
Cultura Documentos
Cristina Boeres
Complexidade de Algoritmos
2
! Métodos analíticos
! objetivo: determinar uma expressão matemática que traduza
o comportamento de tempo de um algoritmo.
! do método utilizado
Exemplo
! Inversão de uma seqüência
fim = n/2;
for (i=0; I < fim; i++)
{
temp = S[i];
S[i] = S[n-1-i];
S[n-1-i] = temp;
}
Complexidade de Algoritmos
10
inicial final
0 1 2 3 4 0 1 2 3 4
M A R I A A I R A M
Complexidade de Algoritmos
11
inicial final
0 1 2 3 4 5 0 1 2 3 4 5
E S T A D O O D A T S E
Complexidade de Algoritmos
12
.........
! i = 23 ⇒ troca S[23] por S[50-1-23] (S[26])
! Soma ! Produto
for(i=0; i<n; i++)
for(i=0; i<n; i++)
for(j=0; j<n; j++){
for(j=0; j<n; j++)
dij = 0;
cij = aij + bij ;
for(k=0; k<n; k++)
dij = dij + aik* bkj;
}
Complexidade de Algoritmos
16
! Seja A um algoritmo
! {E1, ....Em} o conjunto de todas as entradas possíveis de A
19
A notação Ο
! Sejam f(n) e h(n) funções reais não negativas da
variável inteira n ≥ 0
! f(n) = O (h(n)) quando existir uma constante c > 0
e um valor inteiro no tal que
n > no ⇒ f(n) ≤ c.h(n)
20
A notação Ο
f(n) = 8n + 128 ⇒ é O (n2)?
f(n) ≤ c.n2 ?
! Seja c =1
21
A notação Ο
f(n) = 8n + 128 ⇒ é O (n2)?
f(n) ≤ c.n2 ?
! Então, com c =1 n=8, temos
8n + 128 ≤ n2 ?
22
A notação Ο
f(n) = 8n + 128 ⇒ é O (n2)?
f(n) ≤ c.n2 ?
! Então, com c =1 n=8, temos
8n + 128 ≤ n2 ?
8 (8) + 128 ≤ (8)2?
64 + 128 ≤ 128?
23
A notação Ο
f(n) = 8n + 128 ⇒ é O (n2)?
f(n) ≤ c.n2 ?
! Então, com c =1 n=8, temos
8n + 128 ≤ n2 ?
8 (8) + 128 ≤ (8)2?
64 + 128 ≤ 128?
24
A notação Ο
f(n) = 8n + 128 ⇒ é O (n2)?
f(n) ≤ c.n2 ?
! Então, com c =1 n=20, temos
8n + 128 ≤ n2 ?
25
A notação Ο
f(n) = 8n + 128 ⇒ é O (n2)?
f(n) ≤ c.n2 ?
! Então, com c =1 n=20, temos
8n + 128 ≤ n2 ?
8 (20) + 128 ≤ 202 ?
160 + 128 ≤ 400?
26
A notação Ο
f(n) = 8n + 128 ⇒ é O (n2)?
f(n) ≤ c.n2 ?
! Então, com c =1 n=20, temos
8n + 128 ≤ n2 ?
8 (20) + 128 ≤ 202 ?
160 + 128 ≤ 400? OK!!!
27
A notação Ο
! Tempo (ou espaço) é contabilizado em número de
passos do algoritmo (unidade de armazenamento)
28
A notação Ο
! Complexidade de pior caso
! desprezar constantes aditivas ou multiplicativas
! número de passos 3n será aproximado para n
! interesse assintótico: termos de menor grau
podem ser desprezados:
! n2 + n será aproximado para n2
! 6n3 + 4n - 9 será aproximado para n3
29
A notação Ο
! A função atua como um limite superior
assintótico da função f
! f = n2 -1 ⇒ f = Ο(n2)
! f = n2 -1 ⇒ f = Ο(n3)
! f = 403 ⇒ f = Ο(1)
30
A notação Ο
! constantes são ignoradas e somente a função que
cresce mais rápido é considerada
função Ο()
3 + 2n Ο( )
200n3 Ο( )
0.1 n Ο( )
101000 Ο( )
2n + 999 Ο( )
2n + 999n Ο( )
log n + n999 Ο( )
31
A notação Ο
! constantes são ignoradas e somente a função que
cresce mais rápido é considerada
função Ο()
3 + 2n Ο(n)
200n3 Ο(n3)
0.1 n Ο(n)
101000 Ο(1)
2n + 999 Ο(n)
2n + 999n Ο(2n)
log n + n999 Ο(n999)
32
A notação Ο
! g(n), h(n) - funções reais positivas
! k - constante
! f1(n) = g(n) e f2(n) = h(n)
34
A notação Ο
! Para a inversão
! efetua sempre n/2 passos então sua complexidade é Ο(n)
35
A notação Ο
! por outro lado, um outro exemplo:
! duas matrizes A e B de dimensões n x n
! dependendo do valor de x
! calcula a soma: se x =0 " A + B
36
A notação Ο
! entrada: n2+1 informações - tamanho O(n2)
! se x =0 então complexidade: O(n2)
! complexidade do melhor caso
37
Alguns conceitos
T(n) notação
O (1) constante
O (log log n) super-rápido
O (log n) logarítmico – muito bom
O (n) linear – toda a entrada é visitada
O (n log n) limite de muitos problemas
O (n2) quadrático
O (nk) polinomial no tamanho da entrada
O (kn), O (n!), O (nn) exponencial – ruim!
38
Noções de Complexidade
39
Recursividade
40
Recursividade
41
Recursividade
Implementação recursiva
x! = se x <=0 1 senão x * (x-1)!
int fatorial (int N)
{
if (N<= 1)
return(1);
else
return( N * fatorial(N-1));
}
43
Recursividade
! X= fatorial (4)
! return( 4* fatorial(3) )
! return( 3* fatorial(2) )
! return( 2* fatorial(1) )
! return( 1 )
44
Análise da complexidade
# relação de recorrência
● a função é definida em termos dela própria, recursivamente
! substituição repetida
int fatorial (int N)
{
if (N<= 1)
return(1);
else
return( N * fatorial(N-1));
}
45
Análise da complexidade
T(n)
! tempo de processar o algoritmo para entrada n
! número de passos ou operações dominantes
46
Análise da complexidade
Passos iteração
= (T(n-1)) + 1 - 1ª substituição
= (T(n-2) + 1) + 1
= T(n-2) + 2
47
Análise da complexidade
Passos iteração
= (T(n-1)) + 1 - 1ª substituição
= (T(n-2) + 1) + 1
= T(n-2) + 2 - 2ª substitição
= (T(n-3) + 1) + 2
= T(n-3) + 3
48
Análise da complexidade
Passos iteração
= (T(n-1)) + 1 - 1ª substituição
= (T(n-2) + 1) + 1
= T(n-2) + 2 - 2ª substitição
= (T(n-3) + 1) + 2
= T(n-3) + 3 - 3ª substituição
49
Análise da complexidade
Passos iteração
= (T(n-1)) + 1 - 1ª substituição
= (T(n-2) + 1) + 1
= T(n-2) + 2 - 2ª substitição
= (T(n-3) + 1) + 2
= T(n-3) + 3 - 3ª substituição
..... ....
= T(n-k) + k - k-ésima substituição
50
Análise da complexidade
51
Resolva as recorrências
! T(n) = 1, se n = 0
= 2 T(n-1) + 1, se n >0
! T(n) =1 se n = 1
= T(n/2) + 1 se n>1
! T(n) =1 se n = 1
= 2T(n/2) - n se n > 1
52
Qual melhor algoritmo?
53