Anda di halaman 1dari 11

ANLISE DE ALGORITMOS AULA 1

FERRAMENTAS DE ANLISE

INTRODUO

As estruturas de dados e os algoritmos so conceitos centrais para a computao, pois


se constituem nas ferramentas bsicas para a construo de softwares. De forma simples, uma
estrutura de dados a forma pela qual a informao organizada e armazenada, e um
algoritmo um procedimento, passo a passo, para realizar alguma tarefa em tempo finito.
O quadro-resumo a seguir exibe as etapas na construo de um programa
computacional, inserindo as estruturas de dados e os algoritmos no processo de soluo de
um problema.

MODELO MATEMTICO

ALGORITMO INFORMAL

TIPOS ABSTRATOS DE DADOS


(TADs*)

ESTRUTURAS DE DADOS

PROGRAMA EM

PROGRAMA

PSEUDOLINGUAGEM

COMPUTACIONAL

TAD a descrio matemtica dos valores que um tipo de dado pode ter e das operaes que
podem ser feitas com eles.

Como se est interessado em bons algoritmos e estruturas de dados, importante a


definio de ferramentas de anlise. A ferramenta bsica de anlise envolve a caracterizao
do tempo de execuo de algoritmos e operaes sobre estruturas de dados, com seu
consumo de memria tambm sendo de interesse.

TEMPO DE EXECUO

Se um algoritmo for implementado, possvel estudar o tempo gasto por ele


executando-o com vrios dados de entrada e registrando o tempo gasto em cada execuo.
Essas medies podem ser feitas de forma precisa usando-se chamadas do sistema que so
includas na linguagem ou no sistema operacional em que o algoritmo foi implementado.
Em geral, o interesse determinar a dependncia do tempo de execuo com respeito
ao tamanho da entrada fornecida para o algoritmo. Para determin-la, podem-se realizar
vrios experimentos e, por meio de grficos, relacionar o tamanho da entrada com o tempo de
execuo medido. Para ser significativa, essa anlise exige que sejam escolhidos bons

Pgina 1 de 11

ANLISE DE ALGORITMOS AULA 1


exemplos de entradas e que sejam feitos testes suficientes para que se possam fazer
afirmaes vlidas sob o ponto de vista estatstico.

2.1

Fatores que afetam o tempo de execuo


O tempo de execuo de um algoritmo depende de uma srie de fatores:

Cresce com o tamanho da entrada, embora possa variar para entradas diferentes,
porm de mesmo tamanho.

afetado pelo hardware em que o algoritmo executado (processador,


freqncia, memria, disco, etc.) e pelo software (sistema operacional, linguagem
de programao, compilador, interpretador, etc.) sobre o qual o algoritmo
implementado, compilado e executado.

Se todos os outros fatores forem iguais, o tempo de execuo do mesmo algoritmo para
os mesmos dados de entrada ser menor se o computador tiver, por exemplo, um processador
muito mais rpido, ou se a implementao for feita como um programa escrito em cdigo de
mquina em vez de uma implementao interpretada em uma mquina virtual.

2.2

Requisitos para uma metodologia geral de anlise


Embora os estudos experimentais dos tempos de execuo sejam teis, eles tm trs

limitaes srias:

Os experimentos so feitos utilizando-se um nmero limitado de entradas de


teste, podendo no ser indicativos do tempo de execuo com outras entradas
que no foram includas nos experimentos.

difcil comparar a eficincia de dois algoritmos, a no ser que os experimentos


para a obteno de seus tempos de execuo tenham sido feitos com o mesmo
conjunto de hardware e software.

necessrio implementar e executar um algoritmo para poder estudar seu tempo


de execuo experimentalmente.

Desta forma, apresentada neste curso uma metodologia geral para analisar o tempo
de execuo de um algoritmo, que:

Leva em conta todas as entradas possveis.

Permite avaliar a eficincia relativa de dois algoritmos independentemente do


hardware e do software em que eles so implementados.

Pode ser feita por meio do estudo de uma descrio de alto nvel do algoritmo
(pseudocdigo) sem que seja necessrio implement-lo ou execut-lo.

Pgina 2 de 11

ANLISE DE ALGORITMOS AULA 1


Essa metodologia objetiva associar a cada algoritmo uma funo f(n) que caracteriza o
tempo de execuo do algoritmo como uma funo do tamanho n da entrada.

ANLISE DE ALGORITMOS

3.1

Operaes primitivas
Como visto anteriormente, a anlise experimental importante, mas tem suas

limitaes. Para analisar um algoritmo em particular sem realizar experimentos para medir seu
tempo de execuo, pode-se usar a abordagem analtica. Esta abordagem consiste em analisar
diretamente o cdigo de alto nvel ou pseudocdigo.
Para isso, define-se um conjunto de operaes primitivas de alto nvel que so
independentes da linguagem de programao usada e podem se identificadas no
pseudocdigo. So exemplos de operaes primitivas:

Atribuio de valores a variveis.

Chamadas de mtodos.

Operaes aritmticas.

Comparao de dois nmeros.

Acesso a um arranjo.

Seguir uma referncia a um objeto.

Retorno de um mtodo.

Uma operao primitiva corresponde a uma instruo de baixo nvel com um tempo de
execuo constante, mas que depende do ambiente em termos de software e hardware.
Entretanto, nesta abordagem assume-se implicitamente que os tempos de execuo de
operaes primitivas diferentes so similares. Assim, o nmero t de operaes primitivas que
um algoritmo realiza ser proporcional ao tempo de execuo desse algoritmo.
Considere-se, como exemplo, o algoritmo seguinte, que retorna o elemento mximo de
um arranjo A de n elementos.
Algoritmo maxVetor (A, n)
Entrada: arranjo A com n0 elementos
Sada: max, o maior elemento em A
{
max=A[0]
% chute inicial
para (i=1, i<n, i++) faa {
se (A[i]>max) ento
max=A[i]
}
retorne (max)
}

Pgina 3 de 11

ANLISE DE ALGORITMOS AULA 1


Nmero de operaes primitivas:

max=A[0]: duas operaes primitivas (indexao de um arranjo e atribuio de


valor a uma varivel).

i=1, no lao: uma operao primitiva (atribuio de valor a uma varivel).

i<n: uma operao primitiva (comparao de dois nmeros) multiplicada por n.

Corpo do lao, que varia entre 4(n-1) e 6(n-1):


o

A[i]>max: duas operaes primitivas (indexao de um arranjo e


comparao de dois nmeros).

max=A[i]: duas operaes primitivas (indexao de um arranjo e atribuio


de valor a uma varivel), que s sero executadas se o teste anterior for
verdadeiro.

i++: duas operaes primitivas (soma e atribuio de valor a uma varivel).

retorne max: uma operao primitiva.

Resumindo:

2 + 1 + n + 4(n-1) + 1 = 5n, no mnimo.

2 + 1 + n + 6(n-1) + 1 = 7n 2, no mximo.

O melhor caso (t(n)=5n) ocorre quando A[0] o maior elemento e, portanto, a varivel
max no tem seu valor alterado posteriormente. O pior caso (t(n)=7n-2) ocorre quando o
arranjo A tem seus elementos em ordem decrescente, de forma que max alterada a cada
iterao do lao.

3.2

Anlise de caso mdio, melhor e de pior caso


Um algoritmo pode ser mais rpido para certas entradas do que para outras. Isto

significa que h situaes em que o nmero de operaes primitivas mnimo (melhor caso) e
outras em que este nmero mximo (pior caso).
possvel expressar o tempo de execuo de um algoritmo como uma mdia calculada a
partir de todas as entradas possveis (caso mdio). Todavia, uma anlise de caso mdio requer
tipicamente que sejam calculados os tempos de execuo baseados em uma distribuio de
probabilidade. Esse tipo de anlise frequentemente exige matemtica sofisticada e teoria das
probabilidades.
A figura seguinte exibe esquematicamente como o tempo de execuo do caso mdio
de um algoritmo pode ter qualquer valor entre o melhor caso e o pior caso, dependendo da
distribuio das entradas.

Pgina 4 de 11

ANLISE DE ALGORITMOS AULA 1

A complexidade do pior caso a mais utilizada porque sua anlise mais fcil do que a
anlise do caso mdio, j que no requer conhecimento sobre teoria das probabilidades (mas
isso no uma regra geral). Requer apenas a habilidade de identificar a pior entrada possvel,
o que geralmente simples. Alm disso, fornece um limite superior para o nmero de passos
que o algoritmo pode efetuar, o que pode conduzir a algoritmos melhores: tendo certeza de
que um algoritmo tem bom desempenho no pior caso garante que ele tem bom desempenho
em todos os casos.

NOTAO ASSINTTICA

Na anlise de algoritmos, importante concentra-se na taxa de crescimento do tempo


de execuo como uma funo do tamanho da entrada n, obtendo-se um quadro geral do
comportamento, em vez de concentra-se em detalhes menores. Frequentemente, basta saber
que o tempo de execuo de um algoritmo como maxVetor cresce proporcionalmente a n.
Para simplificar a anlise, somente o comportamento assinttico avaliado, desconsiderandose constantes aditivas e multiplicativas na expresso matemtica obtida.
Desta forma, caracteriza-se o tempo de execuo e a quantidade de memria relativos a
um algoritmo usando funes que mapeiam nmeros inteiros em nmeros reais , de forma a
concentrar a ateno no comportamento geral do tempo de execuo e da memria exigida.

4.1

Notao O
A notao assinttica foi inventada por P. Bachmann, em 1892, para caracterizar o

comportamento assinttico de funes. Esta notao ficou conhecida como notao O (big oh)
e definida da seguinte forma:

Pgina 5 de 11

ANLISE DE ALGORITMOS AULA 1


Definio: Sejam f(n) e g(n) funes mapeando inteiros no-negativos em nmeros
reais. Dizemos que f(n) O(g(n)) se existe uma constante real c>0 e uma constante inteira n01
tais que f(n)cg(n) para todo inteiro nn0.
Esta definio ilustrada na figura a seguir:

A notao O permite afirmar que uma funo de n assintoticamente menor que ou


igual a outra funo (pela desigualdade ), descontando-se um fator constante (a constante c)
e medida que n cresce para o infinito (condio n0). De outra forma pode-se dizer que a
notao O caracteriza o crescimento assinttico de uma funo estabelecendo um limite
superior quanto taxa de crescimento da funo em relao ao crescimento de n.
A notao O largamente usada para caracterizar o tempo de execuo e o consumo de
memria em funo de um parmetro n que varia de problema para problema. A notao O
permite ignorarem-se fatores constantes e termos de menor ordem, centrando-se nos
componentes que mais afetam o crescimento de uma funo.
A partir do algoritmo maxVetor, discutido anteriormente, pode-se dizer que o seu
tempo de execuo, utilizando a notao assinttica, O(n). De fato, a partir da expresso 7n2, que exprime o nmero mximo de operaes primitivas, a relao f(n)cg(n) verifica, ou
seja: 7n-2 7n, para c7 e para n01.
Exemplos:

20n3 + 10n log n + 5 O(n3). Justificativa: 20n3 + 10n log n + 5 35n3, para c=35 e
n1. De fato, qualquer polinmio da forma aknk + ak-1nk-1 + ... + a0 ser sempre
O(nk).

3log n + log log n O(log n). Justificativa: 3log n + log log n 4log n, para c=4 e n2.

2100 O(1). Justificativa: 2100 2100, para c=2100 e n1.

Pgina 6 de 11

ANLISE DE ALGORITMOS AULA 1


4.2

Notaes mega e theta


Da mesma forma que a notao O fornece um limite assinttico superior sobre uma

funo, outras notaes fornecem maneiras assintticas de fazer outros tipos de comparaes.
Definio: Sejam f(n) e g(n) funes mapeando nmeros inteiros em nmeros reais. Dizse que f(n) (g(n)) (dito f(n) mega de g(n)) se g(n) O(f(n)); ou seja, se existe uma
constante c>0 e uma constante inteira n01 tais que f(n)cg(n) para nn0.
Esta definio permite dizer que uma funo assintoticamente maior que ou igual a
outra, exceto por um fator constante, conforme ilustra o grfico seguinte.

Exemplos:

20n3 + 10n log n + 5 (n3). Justificativa: 20n3 + 10n log n + 5 35n3, para c=35 e
n1. De fato, qualquer polinmio da forma aknk + ak-1nk-1 + ... + a0 ser sempre
(nk).

3log n + log log n (log n). Justificativa: 3log n + log log n 3log n, para c=3 e n2.

7n-2 (n). Justificativa: se f(n) = 7n-2, a relao 7n-2 5n verifica, para c=5 e n0=1

Da mesma que as notaes O e , a definio seguinte permite dizer que duas funes
so assintoticamente iguais, exceto por um fator constante.
Definio: Sejam f(n) e g(n) funes mapeando nmeros inteiros em nmeros reais. Dizse que f(n) (g(n)) (dito f(n) theta de g(n)) se f(n) O(g(n)) e f(n) (g(n)); ou seja, se
existem constantes c>0 e c>0, e uma constante inteira n01 tais que cg(n) f(n) cg(n) para
nn0.
Exemplos:

3log n + log log n (log n). Justificativa: 3log n + log log n 3log n, para c=3 e
n0=2; 3log n + log log n 4log n, para c=4 e n0=2.

Pgina 7 de 11

ANLISE DE ALGORITMOS AULA 1


5

ANLISE ASSINTTICA

A tabela seguinte lista as expresses de complexidade mais freqentes, por ordem de


crescimento assinttico, da direita para a esquerda:

EXPRESSO

NOME

Constante

log

Logartmica

(log )

log quadrado

Raiz quadrada
Linear

log

n log n
Quadrtica
Cbica

Exponencial

Se existem supostamente dois algoritmos diferentes que resolvem o mesmo problema,


um algoritmo A e um algoritmo B, com tempos de execuo O(n) e O(n2), respectivamente,
isso implica que o algoritmo A assintoticamente melhor do que o algoritmo B, embora para
algum dado valor (pequeno) de n seja possvel que B tenha um tempo de execuo menor do
que o algoritmo A.
A diferena na taxa de crescimento das funes pode ser ilustrada pela tabela seguinte.
Por meio desta tabela possvel perceber a importncia da anlise de algoritmos para o
projeto de algoritmos.

log

log

1,4

16

64

16

2,8

24

64

512

256

16

16

64

256

4.096

65.536

32

5,7

32

160

1.024

32.768

4.294.967.296

64

64

384

4.096

262.144

1,84 x 1019

128

11

128

896

16.384

2.097.152

3,40 x 1038

256

16

256

2.048

65.536

16.777.216

1,15 x 1077

Pgina 8 de 11

ANLISE DE ALGORITMOS AULA 1

5.1

512

23

1.024

10

32

512

4.608

262.144

134.217.728

1.024 10.240 1.048.576 1.073.741.824

1,34 x 10154
1,79 x 10308

Exemplos de anlise assinttica de algoritmos

5.1.1 Algoritmo de tempo quadrtico para o problema das mdias prefixadas


Algoritmo prefixAverages1 (X)
Entrada: arranjo X com n1 elementos
Sada: arranjo A com n elementos, tal que A[i] a mdia de X[0] ... X[i]
{
para (i=0; i<n; i++) faa {
b=0
para (j=0; ji; j++) faa {
b=b+X[j]
A[i]=b/(i+1)
}
}
retorne (A)
}
Anlise de complexidade de tempo em qualquer caso: O(n2).

5.1.2 Algoritmo de tempo linear para o problema das mdias prefixadas


Algoritmo prefixAverages2 (X)
Entrada: arranjo X com n1 elementos
Sada: arranjo A com n elementos, tal que A[i] a mdia de X[0] ... X[i]
{
s=0
para (i=0; i<n; i++) faa {
s=s+X[i]
A[i]=s/(i+1)
}
retorne (A)
}
Anlise de complexidade de tempo em qualquer caso: O(n).

5.1.3 Algoritmo de tempo cbico para o clculo do produto matricial


Algoritmo produtoMatricial (A, B)
Entrada: arranjos A e B com nXn elementos, n>0
Sada: arranjo C com nXn elementos
{
para (i=0; i<n; i++)faa {
para (j=0; j<n; j++) faa {
C[i, j]=0
para (k=0; k<n; k++) faa
C[i, j]=A[i, k]*B[k, j]+C[i, j]

Pgina 9 de 11

ANLISE DE ALGORITMOS AULA 1


}
}
retorne (C)
}
Anlise de complexidade de tempo em qualquer caso: O(n3).

5.1.4 Algoritmo de ordenao por insero


Algoritmo insertionSort (A)
Entrada: arranjo A com n1 elementos
Sada: arranjo A com n elementos
{
para (j=1; j<n; j++) faa {
chave=A[j]
i=j-1
enquanto (i0 e A[i]>chave) faa {
A[i+1]=A[i]
i=i-1
}
A[i+1]=chave
}
retorne (A)
}
Anlise de complexidade de tempo do pior caso: O(n2).
Anlise de complexidade de tempo do melhor caso: O(n).
Anlise de complexidade de tempo do caso mdio: O(n2).

EXERCCIOS

a) Ordene a lista de funes a seguir usando a notao O. Agrupe as funes que so uma
da outra.
6 log
2
3

2
5

log log

(log )

2 (log )

log

2
4

log
log

Dica: quando estiver em dvida sobre duas funes f(n) e g(n), considere log (f(n)) e log
(g(n)), ou 2f(n) e 2g(n).
b) Faa um grfico das funes 12 , 6 log ,

e 2 , usando uma escala logartmica

para os eixos x e y; ou seja, para o valor n e para a funo f(n), plote a informao no
ponto (log n, log(f(n))).
c) Mostre que (n+1)5 O(n5).

Pgina 10 de 11

ANLISE DE ALGORITMOS AULA 1


d) O algoritmo A usa 10n log n operaes enquanto que o algoritmo B usa n2 operaes.
Determine o valor para n0 para o qual a melhor do que B para nn0.
e) Mostre que as duas afirmaes a seguir so equivalentes:

f)

i.

O tempo de execuo do algoritmo A O(f(n)).

ii.

No pior caso, o tempo de execuo do algoritmo A O(f(n)).

Para cada par de funes f(n) e g(n) na tabela seguinte, indique se f(n)=O(g(n)) (caso 1), ou
se g(n)=O(f(n)) (caso2).
( )

( )

10

10
log

log

+ log

log

ln

log

log( + 1)

log

10

cos( '2)

sin( '2)
( cos )

Pgina 11 de 11

Anda mungkin juga menyukai