Académique Documents
Professionnel Documents
Culture Documents
E FICINCIA
DE ALGORITMOS E
PROGRAMAS
Medir a eficincia de um algoritmo ou programa significa tentar predizer os recursos necessrios para seu funcionamento. O recurso que temos mais interesse neste momento o tempo
de execuo embora a memria, a comunicao e o uso de portas lgicas tambm podem ser de
interesse. Na anlise de algoritmos e/ou programas alternativos para soluo de um mesmo
problema, aqueles mais eficientes de acordo com algum desses critrios so em geral escolhidos como melhores. Nesta aula faremos uma discusso inicial sobre eficincia de algoritmos e
programas tendo como base as referncias [1, 2, 8].
2.2 A NLISE
DE ALGORITMOS E PROGRAMAS
10
FACOM
UFMS
2.2 A NLISE
DE ALGORITMOS E PROGRAMAS
11
A anlise de um programa pode ser uma tarefa desafiadora envolvendo diversas ferramentas matemticas tais como combinatria discreta, teoria das probabilidades, lgebra e etc.
Como o comportamento de um programa pode ser diferente para cada entrada possvel, precisamos de uma maneira que nos possibilite resumir esse comportamento em frmulas matemticas simples e de fcil compreenso.
Mesmo com a conveno de um modelo fixo de computao para analisar um programa,
ainda precisamos fazer muitas escolhas para decidir como expressar nossa anlise. Um dos
principais objetivos encontrar uma forma de expresso abstrata que simples de escrever
e manipular, que mostra as caractersticas mais importantes das necessidades do programa e
exclui os detalhes mais tediosos.
No difcil notar que a anlise do programa 2.1 depende do nmero de elementos fornecidos na entrada. Isso significa que procurar um elemento x em um conjunto C com milhares
de elementos certamente gasta mais tempo que procur-lo em um conjunto C com apenas trs
elementos. Alm disso, importante tambm notar que o programa 2.1 gasta diferentes quantidades de tempo para buscar um elemento em conjuntos de mesmo tamanho, dependendo de
como os elementos nesses conjuntos esto dispostos, isto , da ordem como so fornecidos na
entrada. Como fcil perceber tambm, em geral o tempo gasto por um programa cresce com
o tamanho da entrada e assim comum descrever o tempo de execuo de um programa como
uma funo do tamanho de sua entrada.
Por tamanho da entrada queremos dizer, quase sempre, o nmero de itens na entrada.
Por exemplo, o vetor C com n nmeros inteiros onde a busca de um elemento ser realizada
tem n itens ou elementos. Em outros casos, como na multiplicao de dois nmeros inteiros, a
melhor medida para o tamanho da entrada o nmero de bits necessrios para representar essa
entrada na base binria. O tempo de execuo de um programa sobre uma entrada particular
o nmero de operaes primitivas, ou passos, executados por ele. Quanto mais independente
da mquina a definio de um passo, mais conveniente para anlise de tempo dos algoritmos
e programas.
Considere ento que uma certa quantidade constante de tempo necessria para executar
cada linha de um programa. Uma linha pode gastar uma quantidade de tempo diferente de
outra linha, mas consideramos que cada execuo da i-sima linha gasta tempo ci , onde ci
uma constante positiva.
Iniciamos a anlise do programa 2.1 destacando que o aspecto mais importante para sua
anlise o tempo gasto com a busca do elemento x no vetor C contendo n nmeros inteiros,
descrita entre a entrada de dados (leitura) e a sada (impresso dos resultados). As linhas
restantes contm diretivas de pr-processador, cabealho da funo main , a prpria entrada
de dados, a prpria sada e tambm a sentena return que finaliza a funo main . fato
que a entrada de dados e a sada so, em geral, inerentes aos problemas computacionais e,
alm disso, sem elas no h sentido em se falar de processamento. Isso quer dizer que, como a
entrada e a sada so inerentes ao programa, o que de fato damos mais importncia na anlise
de um programa no seu tempo gasto no processamento, isto , na transformao dos dados
de entrada nos dados de sada. Isto posto, vamos verificar a seguir o custo de cada linha no
programa 2.1 e tambm o nmero de vezes que cada linha executada. A tabela a seguir ilustra
esses elementos.
FACOM
UFMS
2.2 A NLISE
12
DE ALGORITMOS E PROGRAMAS
#include <stdio.h>
#define MAX 100
int main(void)
{
int n, i, C[MAX], x;
printf("Informe n: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Informe um elemento: ");
scanf("%d", &C[i]);
}
printf("Informe x: ");
scanf("%d", &x);
for (i = 0; i < n && C[i] != x; i++)
;
if (i < n)
printf("%d est na posio %d de C\n", x, i);
else
printf("%d no pertence ao conjunto C\n", x);
return 0;
}
Custo
c1
c2
c3
0
c4
c5
c6
c7
c8
c9
0
c10
c11
c12
0
c13
c14
c15
c16
c17
0
Vezes
1
1
1
1
1
1
1
n+1
n
n
n
1
1
ti
ti 1
1
1
1
1
1
1
O tempo de execuo do programa 2.1 dado pela soma dos tempos para cada sentena
executada. Uma sentena que gasta ci passos e executada n vezes contribui com ci n no tempo
de execuo do programa. Para computar T (n), o tempo de execuo do programa 2.1, devemos somar os produtos das colunas Custo e Vezes , obtendo:
T (n) = c1 + c2 + c3 + c4 + c5 + c6 + c7 (n + 1) + c8 n + c9 n+
c10 + c11 + c12 ti + c13 + c14 + c15 + c16 + c17 .
Observe que, mesmo para entradas de um mesmo tamanho, o tempo de execuo de um
programa pode depender de qual entrada desse tamanho fornecida. Por exemplo, no programa 2.1, o melhor caso ocorre se o elemento x encontra-se na primeira posio do vetor C.
Assim, ti = 1 e o tempo de execuo do melhor caso dado por:
T (n) = c1 + c2 + c3 + c4 + c5 + c6 + c7 (n + 1) + c8 n + c9 n+
c10 + c11 + c12 + c13 + c14 + c15 + c16 + c17
= (c7 + c8 + c9 )n+
(c1 + c2 + c3 + c4 + c5 + c6 + c7 + c10 + c11 + c12 + c13 + c14 + c15 + c16 + c17 ) .
Esse tempo de execuo pode ser expresso como uma funo linear an + b para constantes
a e b, que dependem dos custos ci das sentenas do programa. Assim, o tempo de execuo
dado por uma funo linear em n. No entanto, observe que as constantes c7 , c8 e c9 que
multiplicam n na frmula de T (n) so aquelas que tratam somente da entrada de dados. Evidentemente que para armazenar n nmeros inteiros em um vetor devemos gastar tempo an,
para alguma constante positiva a. Dessa forma, se consideramos apenas a constante c12 na frmula, que trata propriamente da busca, o tempo de execuo de melhor caso, quando ti = 1,
FACOM
UFMS
2.2 A NLISE
DE ALGORITMOS E PROGRAMAS
13
dado por:
T (n) = c12 ti = c12 .
Por outro lado, se o elemento x no se encontra no conjunto C, temos ento o pior caso do
programa. Alm de comparar i com n, comparamos tambm o elemento x com o elemento C[i]
para cada i, 0 6 i 6 n 1. Uma ltima comparao ainda realizada quando i atinge o valor
n. Assim, ti = n + 1 e o tempo de execuo de pior caso dado por:
T (n) = c12 ti = c12 (n + 1) = c12 n + c12 .
Esse tempo de execuo de pior caso pode ser expresso como uma funo linear an + b para
constantes a e b que dependem somente da constante c12 , responsvel pelo trecho do programa
que realiza o processamento.
Na anlise do programa 2.1, estabelecemos os tempos de execuo do melhor caso, quando
encontramos o elemento procurado logo na primeira posio do vetor que representa o conjunto, e do pior caso, quando no encontramos o elemento no vetor. No entanto, estamos em
geral interessados no tempo de execuo de pior caso de um programa, isto , o maior tempo
de execuo para qualquer entrada de tamanho n.
Como o tempo de execuo de pior caso de um programa um limitante superior para seu
tempo de execuo para qualquer entrada, temos ento uma garantia que o programa nunca
vai gastar mais tempo que esse estabelecido. Alm disso, o pior caso ocorre muito freqentemente nos programas em geral, como no caso do problema da busca.
UFMS
2.2 A NLISE
14
DE ALGORITMOS E PROGRAMAS
seja relevante, estamos estudando na verdade a eficincia assinttica de um algoritmo ou programa. Isto , concentramo-nos em saber como o tempo de execuo de um programa cresce
com o tamanho da entrada no limite, quando o tamanho da entrada cresce ilimitadamente.
Usualmente, um programa que assintoticamente mais eficiente ser a melhor escolha para
todas as entradas, excluindo talvez algumas entradas pequenas.
As notaes que usamos para descrever o tempo de execuo assinttico de um programa
so definidas em termos de funes matemticas cujos domnios so o conjunto dos nmeros
naturais N = {0, 1, 2, . . .}. Essas notaes so convenientes para descrever o tempo de execuo
de pior caso T (n) que usualmente definido sobre entradas de tamanhos inteiros.
No incio desta seo estabelecemos que o tempo de execuo de pior caso do programa 2.1
T (n) = O(n). Vamos definir formalmente o que essa notao significa. Para uma dada funo
g(n), denotamos por O(g(n)) o conjunto de funes
O(g(n)) = {f (n) : existem constantes positivas c e n0 tais que
0 6 f (n) 6 cg(n) para todo n > n0 } .
A funo f (n) pertence ao conjunto O(g(n)) se existe uma constante positiva c tal que f (n)
no seja maior que cg(n), para n suficientemente grande. Dessa forma, usamos a notao
O para fornecer um limitante assinttico superior sobre uma funo, dentro de um fator constante. Apesar de O(g(n)) ser um conjunto, escrevemos f (n) = O(g(n)) para indicar que f (n)
um elemento de O(g(n)), isto , que f (n) O(g(n)).
A figura 2.1 mostra a intuio por trs da notao O. Para todos os valores de n direita de
n0 , o valor da funo f (n) est sobre ou abaixo do valor da funo g(n).
cg(n)
f (n)
n
n0
Figura 2.1: f (n) = O(g(n)).
Dessa forma, podemos dizer, por exemplo, que 4n + 1 = O(n). Isso porque existem constantes positivas c e n0 tais que
4n + 1 6 cn
FACOM
UFMS
2.3 A NLISE
15
Conforme j fizemos antes, a anlise linha a linha da funo trocas_sucessivas descrita abaixo.
FACOM
UFMS
2.3 A NLISE
16
Custo
c1
0
c2
c3
c4
c5
c6
c7
c8
0
0
Vezes
1
1
1
n
Pn1
(i + 1)
i=1
Pn1
i=1 i
Pn1
i=1 ti
Pn1
i=1 ti
Pn1
ti
Pi=1
n1
i=1 i
1
n1
X
n1
X
i=1
n1
X
i=1
(i + 1) +
=n+2
=n+2
i=1
n1
X
i=1
i+
n1
X
i+
n1
X
i+
n1
X
1+3
i=1
n1
X
1+3
i=1
n1
X
i=1
i=1
ti +
n1
X
i=1
ti +
n1
X
ti
i=1
ti
0
i=1
n(n 1)
+n1
2
= n2 + n 1 .
=n+2
Ento, sabemos que o tempo de execuo da funo trocas_sucessivas dado pela expresso T (n) = n2 + n 1. Para mostrar que T (n) = O(n2 ) devemos encontrar duas constantes
positivas c e n0 e mostrar que
n2 + n 1 6 cn2 ,
n2 + n 1 6 2n2
n 1 6 n2
FACOM
UFMS
2.3 A NLISE
17
ou seja,
n2 n + 1 > 0 .
Observe ento que a inequao n2 n + 1 > 0 sempre vlida para todo n > 1. Assim,
escolhendo c = 2 e n0 = 1, temos que
n2 + n 1 6 cn2
para todo n > n0 , onde c = 2 e n0 = 1. Portanto, T (n) = O(n2 ), ou seja, o tempo de execuo
do melhor caso da funo trocas_sucessivas quadrtico no tamanho da entrada.
Para definir a entrada que determina o pior caso para a funo trocas_sucessivas devemos notar que quando o vetor contm os n elementos em ordem decrescente, o maior nmero
possvel de trocas realizado. Assim, ti = i para todo i e o tempo de execuo de pior caso
dado pela seguinte expresso:
T (n) = n +
n1
X
n1
X
=n+
i=1
n1
X
i=1
n1
X
i=1
n1
X
i=1
(i + 1) +
(i + 1) +
=n+5
i=1
i+
n1
X
i+3
n1
X
ti
i+3
i=1
n1
X
i=1
i=1
n(n 1)
=n+5
+n1
2
5
5
= n2 n + 2n 1
2
2
5 2 1
= n n1.
2
2
Agora, para mostrar que o tempo de execuo de pior caso T (n) = O(n2 ), escolhemos
c = 5/2 e temos ento que
5 2 1
5
n n 1 6 n2
2
2
2
1
n160
2
ou seja,
1
n+1 > 0
2
e, assim, a inequao (1/2)n + 1 > 0 para todo n > 1. Logo, escolhendo c = 5/2 e n0 = 1 temos
que
5 2 1
n n 1 6 cn2
2
2
para todo n > n0 , onde c = 5/2 e n0 = 1. Assim, T (n) = O(n2 ), ou seja, o tempo de execuo do
pior caso da funo trocas_sucessivas quadrtico no tamanho da entrada. Note tambm
que ambos os tempos de execuo de melhor e de pior caso da funo trocas_sucessivas
tm o mesmo desempenho assinttico.
FACOM
UFMS
2.4 M ORAL
DA HISTRIA
18
FACOM
UFMS
2.4 M ORAL
19
DA HISTRIA
Exerccios
2.1 Qual o menor valor de n tal que um programa com tempo de execuo 100n2 mais
rpido que um programa cujo tempo de execuo 2n , supondo que os programas foram
implementados no mesmo computador?
2.2 Suponha que estamos comparando as implementaes dos mtodos de ordenao por
trocas sucessivas e por intercalao em um mesmo computador. Para entradas de tamanho n, o mtodo das trocas sucessivas gasta 8n2 passos enquanto que o mtodo da intercalao gasta 64n log n passos. Para quais valores de n o mtodo das trocas sucessivas
melhor que o mtodo da intercalao?
2.3 Expresse a funo n3 /1000 100n2 100n + 3 na notao O.
2.4 Para cada funo f (n) e tempo t na tabela abaixo determine o maior tamanho n de um
problema que pode ser resolvido em tempo t, considerando que o programa soluciona o
problema em f (n) microssegundos.
1
segundo
1
minuto
1
hora
1
dia
1
ms
1
ano
1
sculo
log n
n
n
n log n
n2
n3
2n
n!
2.5 verdade que 2n+1 = O(2n )? E verdade que 22n = O(2n )?
2.6 Suponha que voc tenha algoritmos com os cinco tempos de execuo listados abaixo.
Quo mais lento cada um dos algoritmos fica quando voc (i) duplica o tamanho da
entrada, ou (ii) incrementa em uma unidade o tamanho da entrada?
(a) n2
(b) n3
(c) 100n2
(d) n log2 n
(e) 2n
2.7 Suponha que voc tenha algoritmos com os seis tempos de execuo listados abaixo. Suponha que voc tenha um computador capaz de executar 1010 operaes por segundo
e voc precisa computar um resultado em no mximo uma hora de computao. Para
cada um dos algoritmos, qual o maior tamanho da entrada n para o qual voc poderia
receber um resultado em uma hora?
(a) n2
FACOM
UFMS
2.4 M ORAL
20
DA HISTRIA
(b) n3
(c) 100n2
(d) n log2 n
(e) 2n
(f) 22
2.8 Rearranje a seguinte lista de funes em ordem crescente de taxa de crescimento. Isto ,
se a funo g(n) sucede imediatamente a funo f (n) na sua lista, ento verdade que
f (n) = O(g(n)).
f1 (n) = n2.5
f2 (n) = 2n
f3 (n) = n + 10
f4 (n) = 10n
f5 (n) = 100n
f6 (n) = n2 log2 n
2.9 Considere o problema de computar o valor de um polinmio em um
ponto. Dados n
Pn1
coeficientes a0 , a1 , . . . , an1 e um nmero real x, queremos computar i=0
ai xi .
(a) Escreva um programa simples com tempo de execuo de pior caso O(n2 ) para solucionar este problema.
(b) Escreva um programa com tempo de execuo de pior caso O(n) para solucionar
este problema usando o mtodo chamado de regra de Horner para reescrever o polinmio:
n1
X
ai xi = ( (an1 x + an2 )x + + a1 )x + a0 .
i=1
2.10 Seja A[0..n 1] um vetor de n nmeros inteiros distintos dois a dois. Se i < j e A[i] > A[j]
ento o par (i, j) chamado uma inverso de A.
(a) Liste as cinco inverses do vetor A = h2, 3, 8, 6, 1i.
(b) Qual vetor com elementos no conjunto {1, 2, . . . , n} tem a maior quantidade de inverses? Quantas so?
(c) Escreva um programa que determine o nmero de inverses em qualquer permutao de n elementos em tempo de execuo de pior caso O(n log n).
FACOM
UFMS