Escolar Documentos
Profissional Documentos
Cultura Documentos
Note que
Programas mais simples tem menos chance de apresentar
erros, são mais seguros e fáceis e manter.
Programas eficientes e mais estáveis são mais amigáveis
Programas modulares são mais fáceis de manter
..
.
Idéia Geral
import time
import numpy as np
import matplotlib.pyplot as plt
def fibonacci_smart_recursive(n,x1,x2):
if(n==1):
return x1
else:
if(n==2):
return x2
else:
return fibonacci_smart_recursive(n-1,x2,x1+x2)
def fibonacci(n):
fm2=0
fm1=1
if(n>2):
for i in range(2,n):
f=fm1+fm2
fm2=fm1
fm1=f
return f
else:
if(n==2):
return 1
else:
return 0
Idéia Geral
if __name__ == '__main__':
n=10
theTimes=np.empty([n,2])
theN=np.empty([n])
step=50
N=-step+1
for i in range(0,n):
N=N+step
theN[i]=N
print(i)
beg_ts = time.time()
fibonacci(N)
end_ts = time.time()
theTimes[i,0]=end_ts-beg_ts
beg_ts = time.time()
fibonacci_smart_recursive(N,0,1)
end_ts = time.time()
theTimes[i,1]=end_ts-beg_ts
ax = plt.subplot(111)
ax.plot(theN,theTimes[:,0],color='b')
ax.plot(theN,theTimes[:,1],color='r')
ax.set_ylabel('Execution Time')
ax.set_xlabel('n')
plt.show()
plt.savefig('thetimes.eps')
Idéia Geral
0.00045
0.00040
0.00035
0.00030
Execution Time
0.00025
0.00020
0.00015
0.00010
0.00005
0.00000
0 100 200 300 400 500
n
Idéia Geral
Definição
Big O - Notation: Uma função t(n) é dita ser O(g (n)), denotada
por t(n) ∈ O(g (n)), se existe uma constante positiva c e um
inteiro não negativo n0 tal que
t(n) ≤ cg (n) ∀n ≥ n0
Exemplo
t(n) = n ∈ O(n2 ). Qual o valor de c e n0 ?
Exemplo
t(n) = 100n + 5 ∈ O(n2 ). Qual o valor de c e n0 ?
Exemplo
t(n) = 12 n(n − 1) ∈ O(n2 ). Qual o valor de c e n0 ?
Notação Assintótica - continuação
Definição
Big Ω - Notation: Uma função t(n) é dita ser Ω(g (n)), denotada
por t(n) ∈ Ω(g (n)), se existe uma constante positiva c e um
inteiro não negativo n0 tal que
t(n) ≥ cg (n) ∀n ≥ n0
Exemplo
t(n) = 1/2n2 é Ω(n2 ). Qual o valor de c e n0 ?
Notação Assintótica - continuação
Definição
Big Θ - Notation: Uma função t(n) é dita ser Θ(g (n)), denotada
por t(n) ∈ Θ(g (n)), se existem constantes positivas c1 e c2 e um
inteiro não negativo n0 tal que
Exemplo
t(n) = n2 é Θ(n2 ). Qual os valores de c1 e c2 e n0 ?
Receita para analisar a
eficiência de algoritmos não-recursivos
Exemplo
Considere o problema de achar o maior valor de uma lista de n
números.
Receita para analisar a
eficiência de algoritmos não-recursivos
def max_list(myList):
maxVal=myList[0]
n=len(myList)
for i in range(1,n):
if(myList[i]>maxVal):
maxVal=myList[i]
return maxVal
if __name__ == '__main__':
myList=[4,3,2,1,9, 17,6]
print(max_list(myList))
Receita para analisar a
eficiência de algoritmos não-recursivos
Exemplo
Calcule o fatorial F (n) = n!.
Receita para analisar a
eficiência de algoritmos recursivos
def F(n):
if(n==0):
return 1
else:
return n*F(n-1)
if __name__ == '__main__':
n=5
print(F(n))
Receita para analisar a
eficiência de algoritmos recursivos
M(0) = 0
Então, temos
M(n) = M(n − 1) + 1
Substituindo M(n − 1) = M(n − 2) + 1, temos
M(n) = M(n − 2) + 1 + 1
chegando a
M(n) = n ∈ Θ(n)
Receita para analisar a
eficiência de algoritmos recursivos
Aquele ”porém”:
Exemplo
(Torre de Hanoi) Lembre que a solução convencional do problema
conhecido como Torre de Hanoi é dada pela seguinte relação de
recorrência:
T (n) = 2T (n − 1) + 1
Ou seja, T (0) = 0, T (1) = 1, T (2) = 3, T (3) = 7 · · ·
Parece que T (n) = 2n − 1.
Vamos testar:
T (0) = 20 − 1 = 0
T (n) = 2T (n − 1) + 1 = 2(2n−1 − 1) + 1 = 2n − 1
Solução de equações de recorrência:
árvores recursivas
Exemplo
Seja n uma potência de 2 e considere a seguinte recorrência:
cn
cn cn
2 2
cn cn cn cn
4 4 4 4
Teorema
(Master Theorem) Seja a ≥ 1 e b > 1 constantes, f (n) uma
função e T (n) definida usando a recorrência
cn
cn cn
2 2
cn cn cn cn
4 4 4 4
Exemplo
(Problema da Moeda Falsa) Suponha que existem n (onde n é
potência de 2) moedas onde uma é falsa e mais leve. Como
encontrar essa moeda usando uma balança de dois pratos?
Master Theorem (continuação)