Escolar Documentos
Profissional Documentos
Cultura Documentos
APOSTILA I DA DISCIPLINA
ANÁLISE DE ALGORITMOS
Alex Avellar
Universidade Santa Úrsula 2
Disciplina: Análise de Algoritmos
1.1 Definições
Neste caso, se o trecho tem apenas essa função, pode ser considerado um algoritmo
e é possível analisá-lo individualmente.
1. Melhor caso – o melhor caso representa uma instância que faz o algoritmo executar
utilizando o menor tempo possível.
2. Pior caso – o maior tempo demorado pelo algoritmo para executar alguma instância.
3. Caso médio – a média de tempo que o algoritmo demora para executar.
Se colocarmos esses valores em um gráfico (vide Gráfico 1), veremos que esses
valores são representados por uma reta. Lembrando um pouco das aulas de geometria,
temos que uma reta pode ser representa por uma função linear do tipo ax+b.
7000
6000
5000
4000
3000
2000
1000
0
0,001 0,01 0,05 0,1 0,5 1 2 3 4 5 6
Grafico 1
1.2.1 Notação O
Esta notação é utilizada para analisar o pior caso.
Uma função g(n) é O(f(n)) se ∃ c>0 e n0 tais que g(n) <= c f(n) para n>=n0.
Explicação: uma função g(n) é da ordem de complexidade de f(n) se existe uma constante c
e um valor n0 tal que para qualquer valor de n maior do que n0 g(n) é menor ou igual a
c.f(n).
Isso significa que:
• f(n) é um limite superior para g(n)
• f(n) denomina assintoticamente g(n)
Propriedades:
• f(n) = O(f(n))
• c. f(n) = O(f(n)), c=constante
• O(f(n)) = O(f(n)) = O(f(n))
Universidade Santa Úrsula 6
Disciplina: Análise de Algoritmos
• O(O(f(n))) = O(f(n))
• O(f(n)) = O(g(n)) = O(max(f(n),g(n))
• O(f(n)) . O(g(n)) = O (f(n) . g(n))
1.2.2 Notação Ω
Esta notação é utilizada para analisar o melhor caso.
Uma função f(n) = Ω(g(n)) se existem constantes c e no, tal que c.g(n) <=f(n) para
n>=no.
Isso significa que:
• f(n) é um limite inferior para g(n)
1.2.3 Notação Θ
Esta notação é utilizada para analisar o caso médio.
Uma função f(n) = Θ(g(n)) se existem constantes c1, c2 e no tais que c1. g(n) <=
f(n) <= c2.g(n) para n>=no.
Universidade Santa Úrsula 7
Disciplina: Análise de Algoritmos
Algoritmo Complexidade
A1 n
A2 n log n
A3 n2
A4 n3
A5 2n
Função Nome
1 Constante
log n Logarítmica
log2 n Log quadrático
n Linear
n log n n log n
n2 Quadrática
n3 Cúbica
2n exponencial
Universidade Santa Úrsula 8
Disciplina: Análise de Algoritmos
Exercícios
1. Qual é a ordem de complexidade das seguintes funções (utilize a notação O).
a) f(n) = n2 + 2
b) g(n) = 503
c) g(n) = 2 log n + n
d) g(n) = 10. 2n
e) f(n) = n log n + log n
Vejamos então algumas regras simples para se obter essa fórmula a partir de um
algoritmo.
int x=1;
x= (1+y);
readln( );
writeln(“Digite um número”);
Podemos facilmente notar que qualquer desses comandos, a não ser que esteja
dentro de um laço, será executado uma única vez. Ou seja, são comandos que não
dependem do volume de dados de entrada.
Portanto, dizemos que esses comandos têm ordem de complexidade constante, ou O(1).
Universidade Santa Úrsula 9
Disciplina: Análise de Algoritmos
For (i=1;i<=10;i++)
{
vetor[i]=i; O(1)
vetor[i+1]=x; O(1)
}
3 – Laços aninhados
Devem ser analisados de dentro para fora. O tempo total de execução de uma
instrução dentro de um grupo de laços aninhados é o tempo de execução da instrução
multiplicado pelo produto do tamanho de todos os laços.
Exemplo:
For(i=1;i<n;i++)
{
For(j=1;j<n,j++)
{
k= k+1; O(1)
}
}
4 – Instruções consecutivas
Simplesmente soma-se a complexidade de cada instrução, sendo que os termos de
menor ordem são ignorados.
Exemplo:
Universidade Santa Úrsula 10
Disciplina: Análise de Algoritmos
for(i=1;i<n;i++){
a[i] = 0;
}
for (i=1;i<n;i++) {
for(j = 1;j<n; j++) {
a[i] = a[j] + 1;
}
}
5 – If-then-else
Considere o exemplo abaixo:
If condição then
expressão1;
Else
expressão2;
6 – Chamadas de Função
A análise segue a mesma regra de laços aninhados: analise tudo de dentro para fora.
Ou seja, para calcular a complexidade de um programa com várias funções, calcule
primeiramente a complexidade de cada uma das funções e depois considere cada uma das
funções como uma instrução, com a complexidade da função.
7 - Recursão
Existem dois tipos de casos. No caso de algoritmos recursivos mais simples, pode-
se simular uma linearização, substituindo-se a chamada recursiva por alguns laços
aninhados ou por uma outra subrotina extra e eventualmente uma pilha para controlá-la.
Neste caso, o cálculo é simples e pode ser feito depois da linearização. O segundo caso é
com algoritmos recursivos mais complexos, quando não é possível realizar a linearização.
Universidade Santa Úrsula 11
Disciplina: Análise de Algoritmos
Neste caso obtemos uma relação de recorrência que tem que ser resolvida e é uma tarefa
matemática menos trivial.
Vejamos então, inicialmente, um exemplo do primeiro caso, que é mais simples.
Exemplo: fatorial recursivo e fatorial linearizado:
Fatorial _recursivo(n);
Início
Se n<= 1 então
retorne 1;
Senão
Retorne (n* fatorial_recursivo(n-1));
Fim
Fatorial_linear(n);
Início
Fatorial 1;
Para i de 2 até n
Fatorial fatorial * i;
Retorne fatorial;
Fim
Como podemos perceber, as duas funções fazem a mesma coisa: isto é, calculam o
fatorial de n. No entanto, o primeiro algoritmo o faz de forma recursiva, já o segundo o faz
de forma linear, com complexidade O(n).
Bibliografia
Laporte, G., Asef-Vazir, A. And Sriskandarajah, C. Some applications of the generalized
traveling salesman problem. JORS 47, 1996.
Salomon, M., Solomon, M., van Wassenhove, L., Dumas, Y and Dauzère-Pérès, S. Solving
the discrete lotsizing and scheduling problem with sequence dependent set-up costs and
set-up times using the traveling salesman problem with time windows. EJOR, 100, 1997.
Whitley, D., Starkwheather, T. and Shaner, D. The traveling salesman and sequence
scheduling: quality solutions using genetic recombinations. Handbook of Genetics
Algorithms. Edt. L. Davis van Nostrand, 1991.
Bodin, L., Golden, B., Assad, A. and Ball, M. Routing and Scheduling of vechicles and
crews: the state of the art. Special Issue. England: Pergamon Press, 1983.
Fontes da Internet:
http://www.inf.ufpr.br/~andre/Disciplinas/BSc/CI065/michel/Intro/intro.html