Professional Documents
Culture Documents
Execuo de um
Programa
David Menotti
Algoritmos e Estruturas de Dados I
DECOM UFOP
Classes de
Comportamento
Se f uma funo de complexidade para um algoritmo F,
Assinttico
ento O(f) considerada a complexidade assinttica ou o
comportamento assinttico do algoritmo F.
A relao de dominao assinttica permite comparar funes
de complexidade.
Entretanto, se as funes f e g dominam assintoticamente uma
a outra, ento os algoritmos associados so equivalentes.
Nestes casos, o comportamento assinttico no serve para
comparar os algoritmos.
David Menotti
Algoritmos e Estrutura de
Dados I
Classes de
Comportamento
Por exemplo, considere dois algoritmos F e G aplicados
Assinttico
mesma classe de problemas,
sendo que F leva trs vezes o
tempo de G ao serem executados, isto , f(n) = 3g(n), sendo que
O(f(n)) = O(g(n)).
Logo, o comportamento assinttico no serve para comparar
os algoritmos F e G, porque eles diferem apenas por uma
constante.
Podemos avaliar programas comparando as funes de
complexidade, negligenciando as constantes de
proporcionalidade.
David Menotti
Algoritmos e Estrutura de
Dados I
Comparao de
Programas
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(1)
David Menotti
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(log n)
David Menotti
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(n)
David Menotti
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(n log n)
David Menotti
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(n2)
David Menotti
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(n3)
David Menotti
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(2n)
David Menotti
Algoritmos e Estrutura de
Dados I
Principais Classes de
Problemas
f(n) = O(n!)
David Menotti
Algoritmos e Estrutura de
Dados I
Comparao de Funes
de Complexidade
David Menotti
Algoritmos e Estrutura de
Dados I
Comparao de Funes
de Complexidade
(tamanho)
* t = tamanho do problema
David Menotti
Algoritmos e Estrutura de
Dados I
Algoritmo Polinomial
David Menotti
Algoritmos e Estrutura de
Dados I
Algoritmos Exponenciais x
Polinomiais
David Menotti
Algoritmos e Estrutura de
Dados I
Algoritmos Exponenciais x
Polinomiais - Excees
David Menotti
Algoritmos e Estrutura de
Dados I
Exemplo de Algoritmo
Exponencial
Um caixeiro viajante deseja visitar n cidades de tal forma que
O percurso < c1, c3, c4, c2, c1> uma soluo para o
problema, cujo percurso total tem distncia 24.
David Menotti
Algoritmos e Estrutura de
Dados I
Exemplo de Algoritmo
Exponencial
Um algoritmo simples seria verificar todas as rotas e escolher a
menor delas.
H (n - 1)! rotas possveis e a distncia total percorrida em cada
rota envolve n adies, logo o nmero total de adies n!.
No exemplo anterior teramos 24 adies.
Suponha agora 50 cidades: o nmero de adies seria
50! 1064.
Em um computador que executa 109 adies por segundo, o
tempo total para resolver o problema com 50 cidades seria maior
do que 1045 sculos s para executar as adies.
O problema do caixeiro viajante aparece com freqncia em
problemas relacionados com transporte, mas tambm
aplicaes importantes relacionadas com otimizao de caminho
percorrido.
David Menotti
Algoritmos e Estrutura de
Dados I
Tcnicas de Anlise de
Algoritmos
Determinar o tempo de execuo de um programa
pode ser um problema matemtico complexo;
Determinar a ordem do tempo de execuo, sem
preocupao com o valor da constante envolvida,
pode ser uma tarefa mais simples.
A anlise utiliza tcnicas de matemtica discreta,
envolvendo contagem ou enumerao dos
elementos de um conjunto:
manipulao de somas
produtos,
permutaes,
fatoriais,
coeficientes binomiais,
soluo de equaes de recorrncia
David Menotti
Algoritmos e Estrutura de
Dados I
Anlise do Tempo de
Execuo
Comando de atribuio, de leitura ou de escrita: O(1).
Seqncia de comandos: determinado pelo maior tempo de
execuo de qualquer comando da seqncia.
Comando de deciso: tempo dos comandos dentro do comando
condicional, mais tempo para avaliar a condio, que O(1).
Anel: soma do tempo de execuo do corpo do anel mais o
tempo de avaliar a condio para terminao (geralmente O(1)),
multiplicado pelo nmero de iteraes.
Procedimentos no recursivos: cada um deve ser computado
separadamente um a um, iniciando com os que no chamam
outros procedimentos. Avalia-se ento os que chamam os j
avaliados (utilizando os tempos desses). O processo repetido
at chegar no programa principal.
David Menotti
Algoritmos e Estrutura de
Dados I
Exemplo 1
void exemplo1 (int n)
{
int i, a;
a=0;
for (i=0; i<n; i++)
a+=i;
}
David Menotti
Algoritmos e Estrutura de
Dados I
Exemplo 2
void exemplo2 (int n)
{
int i,j,a;
a=0;
for (i=0; i<n; i++)
for (j=n; j>i; j--)
a+=i+j;
exemplo1(n);
}
David Menotti
Algoritmos e Estrutura de
Dados I
Procedimento No
Algoritmo para ordenar os Recursivo
n elementos de um conjunto A em ordem ascendente.
void Ordena(Vetor A, , int n)
{ /*ordena o vetor A em ordem ascendente*/
int i, j, min,aux;
(1)
(2)
{ min = i;
(3)
(4)
(5)
(6)
A[ min ] = A[ i ];
(7)
A[ i ] = aux;
(8)
}
}
David Menotti
Algoritmos e Estrutura de
Dados I
Algoritmo de Ordenao
David Menotti
Algoritmos e Estrutura de
Dados I
Anlise do Procedimento
No Recursivo
Anel Interno
Contm um comando de deciso, com um comando apenas
de atribuio. Ambos levam tempo constante para
serem executados.
Quanto ao corpo do comando de deciso, devemos
considerar o pior caso, assumindo que ser sempre
executado.
O tempo para incrementar o ndice do anel e avaliar sua
condio de terminao O(1).
O tempo combinado para executar uma vez o anel
O(max(1, 1, 1)) = O(1), conforme regra da soma para a
notao O
Como o nmero de iteraes n i 1, o tempo gasto no anel
O((n i 1) x 1) = O(n i 1), conforme regra do produto
para a notao O.
David Menotti
Algoritmos e Estrutura de
Dados I
Anlise do Procedimento
No Recursivo
Anel Externo
Contm, alm do anel interno, quatro comandos de
atribuio.
O(max(1, (n i 1), 1, 1, 1)) = O(n i 1).
A linha (1) executada n - 1 vezes, e o tempo total para
executar o programa est limitado ao produto de uma
constante pelo somatrio de (n i 1): 2
n(n 1) n
n
n2
(
n
1
)
...
O(n 2 )
i 0
2
2 2
Se considerarmos o nmero de comparaes como a
medida de custo relevante, o programa faz (n2)/2 - n/2
comparaes para ordenar n elementos.
Se considerarmos o nmero de trocas, o programa
realiza
Algoritmos e Estrutura de
David
Menotti exatamente n - 1 trocas.
Dados I
Exerccio 1
// Considere A, B e C vetores globais
void p1 (int n)
{
int i, j, k;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
C[i][j]=0;
for (k=n-1; k>=0; k--)
C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
}
David Menotti
Algoritmos e Estrutura de
Dados I
Exerccio 2
void p2 (int n)
{
int i, j, x, y;
x = y = 0;
for (i=1; i<=n; i++)
{
for (j=i; j<=n; j++)
x = x + 1;
for (j=1; j<i; j++)
y = y + 1;
}
}
David Menotti
Algoritmos e Estrutura de
Dados I
Exerccio 3
void Exercicio3(n){
int i, j, a;
for (i=0; i<n; i++){
if (x[i] > 10)
for (j=0; j<n; j++)
x[j] = x[j] + 2;
else
x[i] = 1;
j = n-1;
while (j >= 0) {
x[j] = x[j] - 2;
j = j - 1;
}
}
}
David Menotti
Algoritmos e Estrutura de
Dados I
Exerccio 3
void Exercicio3(n){
int i, j, a;
for (i=0; i<n; i++){
if (x[i] > 10)
for (j=i+1; j<n; j++)
x[j] = x[j] + 2;
else
x[i] = 1;
j = n-1;
while (j >= 0) {
x[j] = x[j] - 2;
j = j - 1;
}
}
}
David Menotti
Algoritmos e Estrutura de
Dados I