Documente Academic
Documente Profesional
Documente Cultură
Departamento de Informtica
Centro de Cincias Exatas e Tecnolgicas
Universidade Federal de Viosa
Notao assinttica
INF 112 Programao 2
Como visto, a anlise de eficincia de
algoritmos normalmente se concentra na
ordem de complexidade da operao
bsica do algoritmo.
Para comparar essa ordem, so utilizadas
trs notaes: O, ,
Vamos estudar tais notaes de maneira
informal.
Notao assinttica: O (o maisculo), ,
INF 112 Programao 2
O(g(n)) : conjunto de todas as funes com ordem de
crescimento menor ou igual a g(n).
(g(n)) : conjunto de todas as funes com ordem de
crescimento maior ou igual a g(n).
(g(n)) : conjunto de todas as funes com mesma ordem de
crescimento que g(n).
Vamos nos concentrar na notao O.
O(g(n)) : conjunto de todas as funes com
INF 112 Programao 2
O(g(n)) : conjunto de todas as funes com
INF 112 Programao 2
Ex: n O(n)
Se t(n) O(g(n)) e g(n) O(h(n)), ento t(n) O(h(n)).
Ex: n O(n) e n O(n) n O(n)
Se t1(n) O(g1(n)) e t2(n) O(g2(n)), ento t1(n) + t2(n)
O( max{g1(n), g2(n) } )
Ex: n O(n), n O(n) n + n O(max{n,n}) = O(n)
Porm, pode haver algumas excees:
Por exemplo, um algoritmo que executa 10n operaes bsicas
poderia ser menos eficiente do que um algoritmo que realiza n
operaes bsicas para n 10.
Porm, essas anomalias so MUITO RARAS. Em geral, pode-se
assumir que um algoritmo O(n) mais eficiente do que um O(n)
mesmo para entradas de tamanho moderado.
int mx = v[0];
for(int i=1;i<n;i++)
if (v[i] > mx)
mx = v[i];
return mx;
}
Operao bsica: comparao.
Tamanho da entrada: nmero de elementos no array (n).
O nmero de comparaes sempre o mesmo para arrays de mesmo tamanho.
n1
Nmero de comparaes: 1 1 = n-1
Classe de complexidade: O(n)
for(int i=0;i<n;i++)
if (v[i] == elem)
return i;
return -1;
}
Operao bsica: comparao.
Tamanho da entrada: nmero de elementos no array (n).
O nmero de comparaes varia dependendo do arranjo...
n1
Nmero de comparaes no pior caso: 1 = n
0
Classe de complexidade: O(n)
Exerccio: como seria no melhor caso? e no caso mdio (supondo que todo arranjo contm
o elemento e que a probabilidade dele estar em uma posio a mesma para todas
posies) ?
int ct = 0;
while( n != 0) {
n/=10;
ct++;
}
return ct;
}
Operao bsica: diviso.
Tamanho da entrada: o nmero n.
O tamanho de n dividido por 10 em cada iterao... o nmero de comparaes
aproximadamente: log(n) (base 10)
Classe de complexidade: O(log(n))
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) {
int resp = 0;
for(int k=0;k<n;k++)
resp += a[i][k]*b[k][j];
c[i][j] = resp;
}
}
Operao bsica: multiplicao.
Tamanho da entrada: o lado da matriz (n).
n1 n1 n1
Nmero de multiplicaes: 1=n3
0 0 0
Classe de complexidade: O(n)
Estudos mais detalhados sobre este tema fogem do escopo desta
disciplina (vamos trabalhar de forma muito informal a anlise de
algoritmos).
Por enquanto, o importante ter uma ideia de como funciona a anlise
de complexidade e reconhecer a complexidade de algoritmos simples.
O conhecimento sobre a complexidade de algoritmos muito
importante: ajuda a encontrar gargalos em cdigos, a escolher o
algoritmo mais adequado para cada situao, etc.