O documento discute a análise de algoritmos. Ele explica que a análise de algoritmos avalia a complexidade dos algoritmos para entender sua eficiência. O objetivo da aula é desenvolver habilidades para julgar algoritmos de forma elementar, considerando critérios como tempo de execução e uso de memória. A complexidade é medida em termos do número de operações executadas em função do tamanho da entrada.
1. Universidade Presbiteriana Mackenzie
Aula
2:
Análise
de
Algoritmos
Prof. Ms. Daniel Arndt Alves
Faculdade
de
Computação
e
Informá;ca
Computação e Informática
Faculdade de
Estrutura
de
Dados
II
Análise
de
Algoritmos
1
Daniel
Arndt
Alves
2. Obje6vos
• Por
que
analisar
a
complexidade
dos
algoritmos?
– A
preocupação
com
a
complexidade
dos
algoritmos
é
fundamental
para
projetar
algoritmos
eficientes.
– Podemos
desenvolver
um
algoritmo
e
depois
analisar
a
sua
complexidade
para
verificar
a
sua
eficiência.
– Mas
o
melhor
ainda
é
ter
a
preocupação
de
projetar
algoritmos
eficientes
desde
a
sua
concepção.
Análise
de
Algoritmos
2
3. Análise
de
Algoritmos
• A
Análise
de
Algoritmos
é
um
campo
da
Ciência
da
Computação
que
tem
como
obje6vo
o
entendimento
da
complexidade
dos
algoritmos.
• O
obje6vo
desta
aula
consiste
em
desenvolver
as
habilidades
de
fazer
julgamentos
elementares
da
avaliação
dos
programas.
Análise
de
Algoritmos
3
4. Análise
de
Algoritmos
• Existem
muitos
critérios
com
os
quais
podemos
julgar
um
programa,
por
exemplo:
– Será
que
ele
faz
o
que
se
espera
que
ele
faça?
– Será
que
ele
funciona
corretamente
de
acordo
com
as
especificações?
– Existe
documentação
explicando
como
usá-‐lo
e
como
ele
trabalha?
– O
código
está
legível?
• Os
critérios
acima
são
muito
importantes
quando
se
escreve
soSware,
especialmente
para
grandes
sistemas.
Análise
de
Algoritmos
4
5. Eficiência
ou
Complexidade
de
Algoritmos
• Para
um
dado
problema,
considere
dois
algoritmos
que
o
resolvem:
– Seja
n
um
parâmetro
que
caracteriza
o
tamanho
da
entrada
do
algoritmo.
Por
exemplo,
ordenar
n
números
ou
mul6plicar
duas
matrizes
quadradas
n
x
n
(cada
uma
com
n2
elementos).
– Como
podemos
comparar
os
dois
algoritmos
para
escolher
o
melhor?
Análise
de
Algoritmos
5
6. • Existem
ainda
outros
critérios
diretamente
relacionados
com
o
desempenho:
– tempo
de
computação
– requisitos
de
memória
• A
avaliação
de
desempenho
pode
ser
liberalmente
dividida
em
2
partes:
1. es6ma6vas
precedentes
e
2. testes
posteriores
Análise
de
Algoritmos
6
Complexidade
de
tempo
ou
de
espaço
7. Complexidade
de
tempo
ou
de
espaço
• Precisamos
definir
alguma
medida
que
expresse
a
eficiência.
Costuma-‐se
medir
um
algoritmo
em
termos
de
tempo
de
execução
ou
o
espaço
(de
memória)
u6lizado.
– Para
o
tempo,
podemos
considerar
o
tempo
absoluto
(em
minutos,
segundos,
etc.).
Medir
o
tempo
absoluto
não
é
interessante
por
depender
fortemente
da
máquina.
– Em
Análise
de
Algoritmos
conta-‐se
o
número
de
operações
consideradas
relevantes
realizadas
pelo
algoritmos
e
expressa-‐se
esse
número
como
uma
função
de
n.
Essas
operações
podem
ser
comparações,
operações
aritmé6cas,
movimento
de
dados,
etc.
Análise
de
Algoritmos
7
8. • Considere
inicialmente
uma
es6ma6va
precedente.
Suponha
que
em
algum
ponto
do
seu
programa
encontra-‐se
a
instrução:
x = x + 1;
• Gostaríamos
de
determinar
dois
valores
para
esta
instrução:
– a
duração
de
tempo
para
uma
única
execução;
– a
quan6dade
de
vezes
que
ela
é
executada.
• O
produto
desses
valores
será
o
tempo
total
tomado
por
esta
instrução.
• A
segunda
esta_s6ca
é
chamada
de
contagem
de
frequência
e
varia
de
um
conjunto
de
dados
para
outro.
Análise
de
Algoritmos
8
Complexidade
de
tempo
ou
de
espaço
9. • Uma
das
tarefas
mais
dibceis,
em
es6ma6va
de
contagem
de
frequência,
é
a
seleção
adequada
de
amostras
de
dados
• Será
impossível
determinar
exatamente
quanto
tempo
levará
a
execução
de
qualquer
comando,
a
menos
que
tenhamos
as
informações
seguintes:
– máquina
onde
a
instrução
será
executada;
– conjunto
de
instruções
da
linguagem
da
máquina;
– os
tempos
necessários
para
cada
instrução
da
máquina;
– a
tradução
que
um
compilador
fará
do
código
fonte
para
a
linguagem
da
máquina.
• Assim,
é
possível
determinar
esses
valores
escolhendo
uma
máquina
real
e
um
compilador
existente.
Análise
de
Algoritmos
9
Complexidade
de
tempo
ou
de
espaço
10. • Outra
alterna6va
consiste
em
definir
um
computador
hipoté6co
(com
um
tempo
de
execução
imaginário),
porém
mantendo
os
tempos
razoavelmente
próximos
dos
equipamentos
existentes,
para
que
os
valores
resultantes
sejam
representa6vos.
• Nenhuma
dessas
alterna6vas
mostra-‐se
adequada,
pois
em
ambos
os
casos
o
tempo
determinado
provavelmente
não
se
aplicará
a
muitos
computadores.
• Também
a
variação
do
compilador
de
uma
máquina
para
outra
representará
um
problema.
Análise
de
Algoritmos
10
Complexidade
de
tempo
ou
de
espaço
11. • Todas
essas
considerações
conduzem-‐nos
a
limitar
nossos
obje6vos
em
uma
análise
a
priori.
• Vamos
nos
concentrar
inicialmente
apenas
no
desenvolvimento
da
contagem
de
frequência
para
todas
as
instruções
• Considere
os
seguintes
três
exemplos:
Análise
de
Algoritmos
11
x = x + 1;
for (i = 1; i <= n; i++)
x = x + 1;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
x = x + 1;
(a)
(b)
(c)
Complexidade
de
tempo
ou
de
espaço
12. Análise
de
Algoritmos
• No
programa
(a)
assumimos
que
a
instrução
x = x + 1
não
está
incluída
dentro
de
nenhum
laço
explícito
ou
implícito.
Neste
caso,
a
contagem
de
frequência
é
1
(um)
• •
No
programa
(b)
a
mesma
instrução
será
executada
n
vezes
• No
programa
(c)
n2
vezes
(assumindo
n
>
1)
• Os
valores
1,
n
e
n2
são
as
ordens
de
grandeza
Análise
de
Algoritmos
12
x = x + 1;
for (i = 1; i <= n; i++)
x = x + 1;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
x = x + 1;
(a)
(b)
(c)
13. • Em
geral,
na
análise
de
algoritmos
são
avaliadas
as
situações
(para
uma
entrada
de
tamanho
n)
da
complexidade
do:
– pior
caso
do
algoritmo
(worst
case)
que
é
uma
função
definida
pelo
número
máximo
de
passos
u6lizados;
– caso
médio
do
algoritmo
(average
case)
que
é
uma
função
definida
pelo
número
médio
de
passos
u6lizados;
– melhor
caso
do
algoritmo
(best
case)
que
é
uma
função
definida
pelo
número
mínimo
de
passos
u6lizados;
Análise
de
Algoritmos
13
Pior
caso,
melhor
caso,
caso
médio
14. • Na
análise
de
execução,
a
preocupação
principal
consiste
na
determinação
de
ordem
de
grandeza
de
um
algoritmo
(pior
caso)
Análise
de
Algoritmos
14
Pior
caso,
melhor
caso,
caso
médio
15. Pior
caso,
melhor
caso,
caso
médio
• O
número
de
operações
realizadas
por
um
determinado
algoritmo
pode
depender
da
par6cular
instância
da
entrada.
Em
geral
interessa-‐nos
o
pior
caso,
i.e.,
o
maior
número
de
operações
usadas
para
qualquer
entrada
de
tamanho
n.
• Análises
também
podem
ser
feitas
para
o
melhor
caso
e
o
caso
médio.
Neste
úl6mo,
supõe-‐se
conhecida
uma
certa
distribuição
da
entrada.
Análise
de
Algoritmos
15
16. Pior
caso,
melhor
caso,
caso
médio
• Exemplo:
Busca
seqüencial
de
um
dado
elemento
em
um
vetor
armazenando
n
elementos
de
forma
aleatória.
Discuta
o
pior
caso,
melhor
caso
e
o
caso
médio.
No
caso
médio,
suponha
a
distribuição
uniforme
e
que
o
dado
buscado
está
dentro
do
vetor.
• Como
muda
o
caso
médio
se
o
dado
em
geral
não
está
presente?
Análise
de
Algoritmos
16
18. Complexidade
de
tempo
• Como
exemplo,
considere
o
número
de
operações
de
cada
um
dos
algoritmos
que
resolvem
o
mesmo
problema,
como
função
de
n:
– Algoritmo
1:
f1(n)
=
2n2
+
5n
operações
– Algoritmo
2:
f2(n)
=
500n
+
4000
operações
• Dependendo
do
valor
de
n,
o
Algoritmo
1
pode
requerer
mais
ou
menos
operações
que
o
Algoritmo
2.
• (Compare
as
duas
funções
para
n
=
10
e
n
=
100).
Análise
de
Algoritmos
18
19. Complexidade
de
Tempo
– Algoritmo
1:
f1(n)
=
2n2
+
5n
operações
– Algoritmo
2:
f2(n)
=
500n
+
4000
operações
• Um
caso
de
par6cular
interesse
é
quando
n
tem
valor
muito
grande
,
denominado
comportamento
assintó;co.
• Os
termos
inferiores
e
as
constantes
mul6plica6vas
contribuem
pouco
na
comparação
e
podem
ser
descartados.
Análise
de
Algoritmos
19
n → ∞( )
20. Complexidade
de
Tempo
• O
importante
é
observar
que
f1(n)
cresce
com
n2,
ao
passo
que
f2(n)
cresce
com
n.
Um
crescimento
quadrá6co
é
considerado
pior
que
um
crescimento
linear.
Assim,
vamos
preferir
o
Algoritmo
2
ao
Algoritmo
1.
Análise
de
Algoritmos
20
21. Complexidade
de
tempo
• Para
determinar
a
ordem
de
grandeza,
usa-‐se
frequentemente
as
fórmulas
como:
• no
segmento
do
programa
(c)
anterior
a
instrução
x = x + 1
é
executada
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
x = x + 1;
• Em
geral
Análise
de
Algoritmos
21
22. Exemplo
• Considere
o
algoritmo
para
cálculo
do
fatorial
de
um
número
inteiro
n
dado
a
seguir:
• Cada
instrução
é
contada
uma
vez
• O
tempo
atual
tomado
por
cada
instrução
naturalmente
poderá
variar
• A
instrução
for
é
na
verdade
uma
combinação
de
diversas
instruções,
mas
aqui
vamos
contá-‐la
como
uma
• Então,
a
contagem
total
é
2n
+
1,
como
é
mostrado
na
tabela
seguinte:
Análise
de
Algoritmos
22
1 int fatorial(int n){
2 int i, produto;
3
4 produto = 1;
5 for(i = 2; i <= n; i++)
6 produto = produto * i;
7 return produto
8 }
Linhas
n
Frequência
4,
5,
7
0
3
4,
5,
7
1
3
4,
5,
6,
5,
7
2
3
+
2
4,
5,
6,
5,
6,
5,
7
3
3
+
4
4,
5,
6,
5,
6,
5,
6,
5,
7
4
3
+
6
n
3+2(n-‐1)
=
2n
+
1
Frequentemente,
isso
é
declarado
como
O(n),
ignorando
as
constantes
23. Notação
“O”
• Definição:
O(g(n))
=
{f(n)
:
existem
duas
constantes
c
e
n0
tais
que
|f(n)|
<=
|c*g(n)|,
para
todo
n
>
n0}
• Como,
normalmente,
é
dibcil
determinar
com
exa6dão
f(n),
a
notação
“O”
é
u6lizada
• •
Assim,
a
notação
“O”
fornece
um
limite
superior
para
uma
função
dentro
de
um
fator
constante
Análise
de
Algoritmos
23
25. Notação
“O”
• Dado
um
algoritmo,
analisamos
a
contagem
de
frequência
para
cada
instrução
e
somamos
todas
• Isto
normalmente
resulta
em
um
polinômio
do
6po
(ck!=
0)
P(n)
=
cknk
+
ck-‐1nk-‐1
+
...
+
c1n
+
c0
• Usando
a
notação
“O”
P(n)
=
cknk
+
ck-‐1nk-‐1
+
...
+
c1n
+
c0
=
O(nk)
• Por
outro
lado,
se
qualquer
passo
for
executado
2n
vezes
ou
mais
a
expressão
será
(c
!=
0)
c2n+
P(n)
=
c2n
+
cknk
+
ck-‐1nk-‐1
+
...
+
c1n
+
c0
=
O(2n)
• Assim,
na
notação
“O”,
considera-‐se
apenas
o
termo
de
maior
ordem
Análise
de
Algoritmos
25
27. Notação
“O”
• Dada
uma
função
g(n),
denotamos
por
O(g(n))
o
conjunto
das
funções:
• Isto
é,
para
valores
de
n
suficientemente
grandes,
f(n)
é
igual
ou
menor
que
g(n).
Análise
de
Algoritmos
27
f n( ):∃ constantes c e n0 tais que 0 ≤ f n( )≤ c⋅g n( ) para n ≥ n0{ }
28. Notação
“O”
• Como
abuso
da
notação,
vamos
escrever
ao
invés
de
.
– Algoritmo
1:
f1(n)
=
2n2
+
5n
=
O(n2)
– Algoritmo
2:
f2(n)
=
500n
+
4000
=
O(n)
• Um
polinômio
de
grau
d
é
de
ordem
O(nd).
Como
uma
constante
pode
ser
considerada
um
polinômio
de
grau
0,
então
dizemos
que
uma
constante
é
O(n0)
ou
seja,
O(1).
Análise
de
Algoritmos
28
f n( )= O g n( )( ) f n( )∈O g n( )( )
29. Notação
“O”
• A
notação
– O(1)
indica
que
o
tempo
de
computação
é
constante,
independentemente
de
qualquer
fator
– O(n)
chama-‐se
linear
– O(n2)
chama-‐se
quadrá6ca
– O(n3)
chama-‐se
cúbica
– O(2n)
chama-‐se
exponencial
• Os
tempos
de
computação
O(1),
O(log
n),
O(n),
O(n
log
n),
O(n2),
O(n3)
e
O(2n)
são
aqueles
comumente
encontrados
e
os
quais
vamos
trabalhar
no
decorrer
do
curso,
e
log
n
é,
normalmente,
o
logaritmo
de
n
na
base
2.
Análise
de
Algoritmos
29
30. Notação
“O”
• Possuindo
dois
algoritmos
para
desempenhar
a
mesma
tarefa,
sendo
o
primeiro
com
um
tempo
de
computação
O(n)
e
o
segundo
O(n2),
geralmente
considera-‐se
o
primeiro
como
superior
• Isso
porque
à
medida
que
n
aumenta,
o
tempo
de
processamento
do
segundo
algoritmo
vai
piorar
muito
comparando
com
o
tempo
do
primeiro
Análise
de
Algoritmos
30
43. Importância
Análise
de
Algoritmos
43
• (Verifique
se
resolveria
usar
uma
máquina
mais
rápida
onde
uma
operação
leve
1ps
(pico
seundo)
ao
invés
de
1
ms:
ao
invés
de
10137
séculos,
seriam
10128
séculos
:-‐)
44. Importância
• Podemos
muitas
vezes
melhorar
o
tempo
de
execução
de
um
programa
o6mizando
o
código
(ex.
usar
x
+
x
ao
invés
de
2
x,
evitar
o
re-‐cálculo
de
expressões
já
calculadas,
etc.).
• Entretanto,
melhorias
muito
mais
substanciais
podem
ser
ob6das
se
usarmos
um
algoritmo
diferente,
com
outra
complexidade
de
tempo,
Ex.
obter
um
algoritmo
de
O(n
log
n)
ao
invés
de
O(n2).
Análise
de
Algoritmos
44
45. Cota
superior
ou
limite
superior
(upper
bound)
Análise
de
Algoritmos
45
46. Cota
superior
ou
limite
superior
(upper
bound)
Análise
de
Algoritmos
46