Escolar Documentos
Profissional Documentos
Cultura Documentos
4
Como Comparar algoritmos?
• A unidade de comparação entre dois algoritmos é uma função que
calcula o número de instruções no tamanho da entrada.
• Essa função define a eficiência ou complexidade no tempo do
algoritmo.
• Seja a complexidade do algoritmo A: f(n)=n2 + 2n + 1
• Seja a complexidade do algoritmo B: g(n) = 2n
• Qual dos dois algoritmos e mais eficiente?
5
Como Comparar algoritmos?
• Conclui-se que f (n) é mais eficiente que g(n) a longo prazo.
6
Complexidade assintótica
• A complexidade assintótica é definida pelo crescimento da
complexidade para entradas suficientemente grandes.
7
Ordem Assintóticas
• A complexidade exata costuma conter muita informação, resultando em
expressões como 3n2 + 5n +7 .
• Tais expressões podem ser de difícil analise e manipulação.
• Por essas razões, a análise de complexidade de algoritmos costuma-se concentrar-se em
comportamento assintóticos.
• Uma tal razão constante é similar à que ocorre por uma mudança de
escala (como quando se passa de centímetros a polegadas).
9
Ordem Assintóticas
• O estudo assintótico permite “jogar para debaixo do tapete” os
valores das constantes e os termos não dominantes.
10
Comparação assintótica de funções
• É preciso introduzir um modo de comparar funções (dependência entre o
consumo de tempo de um algoritmo e o tamanho de sua “entrada”).
12
Comparação assintótica de funções
• Esse tipo de matemática, interessado somente em valores enormes
de n, é chamado análise assintótica.
• Nessa matemática, as funções são classificadas em "ordens"; todas
as funções de uma mesma ordem são "equivalentes".
• As cinco funções n² , (3/2)n² , 9999n² , n²/1000 , n²+100n, por
exemplo, pertencem à mesma ordem.
• Estuda-se o comportamento assintótico das funções de custo
(comportamento de suas funções de custo para valores
grandes de n)
• O comportamento assintótico de f(n) representa o limite do
comportamento do custo quando n cresce.
13
Fundamentos Matemáticos - Cota Assintótica Superior (CAS)
• Uma cota assintótica superior é uma função que cresce mais rapidamente do
que outra, permanece acima a partir de certo ponto.
• por exemplo: a função 3n2 cresce mais rapidamente do que a linear n+5,
dizemos que a função quadrática 3n2 é a cota assintótica superior (CAS) para
a linear n+5. Do mesmo modo a função exponencial 2n é CAS para 3n2 .
• (ⱻ 𝑛𝑜 є Ν )(Ɐ n ≥ 𝑛𝑜 ) : f(n)≤g(n)
• Para as funções
• f(n) = 3n2 e exponencial 3n , para n ≥3, temos 3n2 ≤ 3n
15
Fundamentos Matemáticos - Cota Assintótica Superior (CAS)
• Exercício 1: Para as funções linear n+5 , quadrática 3n2 e exponencial 2n ,
verifique que 3n2 é CAS para n+5 e 2n é CAS para 3n2 , determinando uma
constante 𝑛𝑜 є N em cada caso.
16
Análise : Dominação Assintótica
• A análise de um algoritmo geralmente conta com apenas algumas operações
elementares.
• A medida de custo ou medida de complexidade relata o crescimento assintótico
da operação considerada.
• Sejam f e g funções de N em R* conjunto dos reais não nulos, isto é, sem o zero.
17
Dominação Assintótica
Exercício 2:
-Sejam g(n)=(n+1)2 e f(n)=n2 , |g(n)|≤ c × |f(n)|
|f(n)|≤ c × |g(n)|
Para m = 0, c = 1
𝑛2 ≤ (𝑛 + 1)2 para n≥0
19
Notação Ο (ômicron grego maiúsculo) (big O)
• Knuth (1971) criou a notação O (lê-se "O grande") para expressar que
g(n) domina assintoticamente f(n) .
21
Notação Ο (ômicron grego maiúsculo) (big O)
• Exercício 4: quando dizemos que o tempo de execução g(n)=n de um programa é
O(n2), significa que existem constantes c e m tais que, para valores de n ≥ m, g(n) ≤
cn2. c>=1, n≥m, n≥1
n n n2
0 0 0
1 1 1
2 2 4
3 3 9
4 4 16
5 5 25
6 6 36
7 7 49
8 8 64
9 9 81
10 10 100
22
Notação Ο (ômicron grego maiúsculo) (big O)
• Exercício 5: Análise de Complexidade do método de ordenação por
inserção.
23
Notação Ο (ômicron grego maiúsculo) (big O)
• Exercício 5: Análise de Complexidade do método de ordenação por
inserção.
MELHOR CASO : Arranjo em já esta
ordenado em ordem crescente.
• O ciclo exterior executa n−1 vezes
• O ciclo interior while termina imediatamente.
• Então para cada j=2,3,...,n . Descobrimos que A[i]≤chave na
linha 5, quando i tem valor inicial j-1. Portanto tj=1 para
j=2,3,..,n.
i=j-1
while i>0 e A[i]>chave
// A[i]>chave é FALSO
24
Notação Ο (ômicron grego maiúsculo) (big O)
• Exercício 5: Análise de Complexidade do método de ordenação por
inserção. PIOR CASO: Arranjo em já esta ordenado ao
contrário (por ordem decrescente).
-1
• O ciclo exterior executa n−1 vezes
• O ciclo interior executa 1,2,…,n−1 comparações
25
Para j=2 , a linha 5 é executada 2 vezes, o loop encerra pois i=0
Notação Ο (ômicron grego maiúsculo) (big O)
• Notação O (O grande) - é o limite assintótico superior da ordem de
crescimento da função de custo do algoritmo. Lê-se “O” grande de g de n”, o
conjunto de funções:
• A notação Big-O define o limite assintótico superior sobre uma função f(n).
27
Notação Ο (ômicron grego maiúsculo) (big O)
• Onde vou usar Isso?
• É mais fácil determinar que f (n) é O(g(n)), isto é, que assintoticamente f(n) cresce no
máximo como g(n).
28
Notação Ο (ômicron grego maiúsculo) (big O)
• Por exemplo: a estrutura do loop duplamente alinhado do algoritmo de ordenação
por inserção (ver slide 24), produz imediatamente um limite superior 0(n2) para o
tempo de execução do pior caso.
• o total de comparações é:
• (n-1)*(n-1)≈n2
• Este algoritmo tem também complexidade quadrática no pior caso 0(n2) continua
Notação Ο (ômicron grego maiúsculo) (big O)
• Ordenação por inserção
• Lista já esta ordenada (melhor caso)
• x = vec[i]
• j = i-1;
• while(j>=0 && vec[j] > x)
• // vec[j] > x é FALSO
Exercício 5: f(n)=n-1=O(n2 )
n-1≤c. n2 (dividindo tudo por n), obtemos:
𝑛 1 1
- ≤c. n , 1-𝑛 ≤c.n , Logo: para n≥1, c>=0, f(n)=O(n2 )
𝑛 𝑛 32
Exemplo Notação O
• Exercício 6: f está na ordem de O , f=O(g)
• 9n+9=O(n2)
• Provar n≥1
• 9n+9≤cn2
• 9n+9≤cn2 (≠n) => 9+9/n ≤ c.n ,
• n≥1
• c ≥18
33
Exemplo Notação O
• Exercício 6: f está na ordem de O , f=O(g)
• 9n+9=O(n2)
https://pt.symbolab.com/solver/system-of-inequalities-
calculator/9%5E%7B%20%7Dn%2B9%5Cle%20cn%5E%7B2%7D
34
?or=input
Exemplo Notação O
• Exercício 7: f está na ordem de O , f=O(g)
• 2n3+100n=O(n3)
• 2n3+100n≤cn3 dividindo por (n3)
• 2+100/n2 ≤c , para n≥1,c ≥102
35
Exemplo Notação O
• Exercício 8: f está na ordem de O , f=O(g)
36
Exemplo Notação O
• Exercício 9: Suponha que g(n)=3+2/n e que f(n)=n0
• 3+2/n≤cn0
• Então, para n≥2:
• 4≤c , para n≥2,c ≥4
37
Exemplo Notação O
Exercício 10:
g(n) = 30n e f (n) = n2
Alguém domina alguém?
38
Exemplo Notação O
Exercício 10:
g(n) = 30n e f (n) = n2
Alguém domina alguém?
39
Exemplo Notação O
Exercício 10:
g(n) = 30n e f (n) = n2
Alguém domina alguém?
30n≤cn2 (∻n2 )
30/n ≤ c, para n≥=30
c>=1
40
Exemplo Notação O
Exemplo 11:
3 2
• Verificar se g(n)= 𝑛 −2n ∈ O(𝑛2 )
2
3
• 𝑛2 −2n ≤ c𝑛2
2
3
• para c= , n≥0, c>=3/2
2
3 3
• 𝑛 −2n ≤ 𝑛2
2
2 2
• Logo g(n) ∈ O(𝑛2 )
• Escolha restrita:
• c=1
• n2 – 4n ≤0
• n ϵ [0,4]
41
Técnica alternativa para mostrar que g está em O(f)
• Existe uma técnica alternativa para mostrar que alternativa para mostrar que g
está em O(f).
𝒈(𝒏)
• g ε O(f) se lim = 𝒄 , para algum c >=0.
𝒏→∞ 𝒇(𝒏)
• Ou seja , se o limite da razão de g para f existe e não é ∞, então g não cresce
mais rápido do que f .
• Exemplo 14: Considere f(x)=𝑥 2 e g(x)=xlgx. Mostrar que g ε O(f) , mas g Ɇ O(g).
43
Técnica alternativa para mostrar que g está em O(f)
• Exercício 14: Considere f(x)=𝑥 2 e g(x)= xlg x. Mostrar que g ε O(f) , mas g Ɇ O(g).
1
𝑙𝑜𝑔𝑏𝑎 ´=
Regra de L ´Hospital 𝑎.ln(𝑏)
=c
44
Algumas operações com a Notação O
45
Terminologia mais comuns de funções
46
Funções e Taxas de Crescimento
47
Notação Ω (ômega)
• Notação Ω - é o limite assintótico inferior da ordem de crescimento de uma
função f(n).
• Definição: Para uma função g(n), Ω(g(n)) é o conjunto de funções:
Ω(g(n))={f(n) : existem constantes positivas c e 𝑛𝑜 tais que 0≤c.g(n)≤f(n)
para todo n≥ 𝑛𝑜 }
50
Notação Ω (ômega)
• Exercício 16:
• f(n)=𝒏𝟐 ,g(n)=𝟐𝒏
0≤c.g(n)≤f(n)
• Exercício 17: Mostrar que g(n) = 3n3 + 2n2 é Ω(n3) basta fazer c = 3, e então 3n3 +
2n2 ≥ 3n3 para n ≥ 0.
• 3n3 + 2n2 ≥cn3
• Exercicio 18: Dada a função f(n)=7n3 + 5 e g(n)=2n mostrar que a função f(n)
cresce menos rapidamente do que a exponencial g(n)=2n (a partir de um certo
ponto).
• Exercício 19: Dada a função g(n)=n3 e f(n)=6n2+10, mostrar que g(n)=Ω(f(n)),
n>=1, c<=1/16
51
Notação Ω (ômega)
• Exercício 20:
3
• Verificar se g(n)= 𝑛2 −2n ∈ Ω(𝑛2 ), g(n)≥c f(n), para todo n≥𝒏𝒐
2
3
• 𝑛2 −2n ≥ c𝑛2 (≠ 𝑛2 )
2
3 2
• - ≥ c , para c <=1/2
2 𝑛
• para n ≥ 2
• Logo g(n) ∈ Ω(𝑛2 ) g(n)
cf(n)
52
Técnica alternativa para mostrar que g está em Ω(f)
• Ω(g(n))={f(n) : existem constante positivas c e 𝑛𝑜 tais que 0≤c.g(n)≤f(n)
para todo n≥ 𝑛𝑜 }
• Existe uma técnica alternativa para mostrar que alternativa para mostrar
que g está em Ω(f).
𝒈(𝒏) 𝒈(𝒏)
• g ε Ω(f) se lim = ∞ ou lim =c>0 ( se o limite existe)
𝒏→∞ 𝒇(𝒏) 𝒏→∞ 𝒇(𝒏)
53
Notação Θ (theta)
54
Notação Θ (theta)
• Definição: Uma função f(n) pertence ao conjunto Θ(f(n)) se existirem
constantes 𝒄𝟏 , 𝒄𝟐 e m tais que
• Θ(g(n))=
• {f(n) : se existirem constantes 𝒄𝟏 , 𝒄𝟐 positivas e 𝒏𝒐 tais que O≤𝒄𝟏 𝒈(n)≤f(n)
≤𝒄𝟐 g(n) para todo n≥ 𝑛𝑜 }
𝒏𝟑
• 𝒄𝟏 .n2 ≤ − 𝟐𝒏 ≤𝒄𝟐 .n2 (dividindo tudo por n2)
𝟑
𝟏 𝟐
• 𝒄𝟏 ≤ − ≤𝒄𝟐
𝟑 𝒏
1 2 1 2
• INEQUAÇÃO 1) − ≤𝑐2 , n>0, se escolhermos 𝑐2 = ,- ≤0, o que é valido
3 𝑛 3 𝑛
para n≥1. 56
Notação Θ (theta)
𝑛3
• Exercício 21: Seja f(n)= − 2𝑛, mostrar que f(n) é Θ(g(n)=n2) .
3
𝟏 𝟐 𝟏 𝟐 𝟕−𝟔 𝟏
• INEQUAÇÃO 2) 𝒄𝟏 ≤ − escolhendo n≥7 , 𝒄𝟏 ≤ − = = , (n=7 menor
𝟑 𝒏 𝟑 𝟕 𝟐𝟏 𝟐𝟏
valor positivo para o qual c1>0).
𝟏 𝟏 𝑛3
• Logo: escolhendo 𝒄𝟏 = , 𝑐2 = , 𝑛𝑜 =7, verifica-se que g(n)= − 2𝑛 é Θ(f(n)=n2) .
𝟐𝟏 𝟑 3
57
Notação Θ (theta)
3𝑛2
• Exercício 21: Seja g(n)= − 2𝑛, mostrar que g(n) é Θ(f(n)=n2))
2
58
Notação Θ (theta)
• Outras constantes podem existir, mas o mais importante é que exista alguma
escolha para as três constantes.
• De acordo com o que foi mostrado:
slide 41
slide 52
• Isso é coincidência?
59
Notação Θ (theta)
• Outras constantes podem existir, mas o mais importante é que exista alguma
escolha para as três constantes.
• De acordo com o que foi mostrado:
• Isso é coincidência?
• Não,
60
Notação Θ (theta)
• Podemos verificar que 6n3 = Θ(n2)
• A título de contradição , suponha que existem c2 e n≥no.
• Mas : 6n3 = c(n2) dividindo por n2
• n ≤ c2/6 , o que não é válido para n→∞
61
Notação Θ (theta)
• Por limites
𝒈(𝒏)
• g ε Θ(f) se se lim = c, c ε R+ (c≥0)
𝒏→∞ 𝒇(𝒏)
62
Notação Θ (theta)
• Limite assintótico frouxo
• Quando afirmamos que o algoritmo A possui:
• No pior caso: T(n) = 5n2-n+1
• No melhor caso: T(n) = 3n+2
• Isso significa que o algoritmo B possui um limite assintótico rígido, visto que,
no geral, o seu desempenho se comporta da mesma forma para o melhor e
pior caso.
• Ou seja, ele, no geral, é Θ(n).
64
Notação o
Notação o
• Definição: para uma função g(n), denotamos o(g(n)) o conjunto de funções:
• o(g(n))={f(n): para qualquer c>0 e 𝑛𝑜 >0 tais que 0≤f(n)<c.g(n) para todo n>𝑛𝑜 }
• lim n →∞ (f(n)/g(n)) = 0
Notação o
• O limite superior não é assintoticamente justo
• o(g(n))={f(n): para qualquer c>0 e 𝑛𝑜 >0 tais que 0≤f(n)<c.g(n) para todo n>𝑛𝑜 }
• Por exemplo:
• f(n)=2n = o(n²) , g(n)=n² , 0≤2n<c.n² , c>=3, n>=1 .
2𝑛
• o(g(n))= lim 𝑛2 = 0 (ok)
𝑛→∞
• 2n² ≠ o(n²)
2𝑛2
• o(g(n))= lim 𝑛2 =2
𝑛→∞
: logo 2n² não é o(n²), pois lim n →∞ (f(n)/g(n)) ≠ 0
• Ignorando as constantes não podemos dizer que n² é sempre menor que n² para n suficientemente grande.
Notação o
Exercício 22: f(n)=2n2 é o(n3)
• n2 é sempre menor que n3 para um n suficientemente grande, é necessário
determinar 𝑛𝑜 em função de c. 0≤2n2 <c.n3, 𝑛𝑜 ≥3, c>0
n 2n2 n3 c cn3 o
1 2 1 1 1 FALSO 4000
2 8 8 1 8 FALSO
3500
3 18 27 1 27 VERDADEIRO
3000
4 32 64 1 64 VERDADEIRO
2500
5 50 125 1 125 VERDADEIRO
6 72 216 1 216 VERDADEIRO 2000
o(g(n))={f(n): para qualquer c>0 e 𝑛𝑜 >0 tais que 0≤f(n)<c.g(n) para todo n>𝑛𝑜 }
Notação o
Exercício 23: f(n)=2n3 não é o(n3), 0≤2n3<c.n3.
n 2n3 n3 c cn3
1 2 1 1 1 FALSO o
2 16 8 1 8 FALSO
8000
3 54 27 1 27 FALSO
7000
4 128 64 1 64 FALSO
6000
5 250 125 1 125 FALSO
6 432 216 1 216 FALSO 5000
• Ignorando as constantes não podemos dizer que n3 é sempre menor que n3 para um n
suficientemente grande.
• o(g(n))={f(n): para qualquer c>0 e 𝑛𝑜 >0 tais que 0≤f(n)<c.g(n) para todo n>𝑛𝑜 }
Notação w (little ômega)
• w(g(n) o conjunto de funções:
• w(g(n))={f(n): para qualquer c>0 e 𝑛𝑜 >0 tais que 0≤c.g(n)<f(n) para todo n>𝑛𝑜 }
𝑛2 𝑛2
• Exemplo 24: = 𝑤 𝑛 , mas ≠ 𝑤 𝑛2
2 2
𝒇(𝒏)
• lim = ∞, se o limite existir
𝒏→∞ 𝒈(𝒏)
𝑛2 𝒏
• lim ( )/n = lim ( )= ∞ (ok)
𝒏→∞ 2 𝒏→∞ 𝟐
Propriedades das Classes
1 2
𝑛 − 3𝑛 = 𝜃(𝑛2 )
2
𝒇(𝒏)
f ε Θ(g) se se lim = c, c ε R+ (c≥0)
𝒏→∞ 𝒈(𝒏)
𝑛2
lim 1 =2=c
𝑛→∞ 𝑛2
2
𝒈(𝒏)
g ε Θ(f) se se lim = c, c ε R+ (c≥0)
𝒏→∞ 𝒇(𝒏)
1 2
𝑛
2
lim =1/2=c
𝑛→∞ 𝑛2
Propriedades das Classes
Principais Classes de Problemas
• f(n) = O(1)
•f(n) = O(n)
𝒏
• Quando n é 1 milhão, n𝒍𝒐𝒈𝟐
é cerca de 20 milhões.
𝒏
• Quando n é 2 milhões, n𝒍𝒐𝒈𝟐 é cerca de 42 milhões,
pouco mais do que o dobro.
• f(n) = O(n2)
• Um algoritmo de complexidade O(n2) é dito ter complexidade quadrática.
• Ocorrem quando os itens de dados são processados aos pares, muitas
vezes em um anel dentro de outro.
• Quando n é mil, o número de operações é da ordem de 1 milhão.
• Sempre que n dobra, o tempo de execução é multiplicado por 4.
• Úteis para resolver problemas de tamanhos relativamente pequenos.
• Exemplos:
• Algoritmos de ordenação simples como seleção e inserção (no pior
caso).
Principais Classes de Problemas
• f(n) = O(n3)
• Um algoritmo de complexidade O(n3) é dito ter complexidade
cúbica.
• Úteis apenas para resolver pequenos problemas.
• Quando n é 100, o número de operações é da ordem de 1 milhão.
• Sempre que n dobra, o tempo de execução fica multiplicado por 8.
• Exemplo:
• Algoritmo para multiplicação de matrizes.
Principais Classes de Problemas
• f(n) = O(2n)
• Um algoritmo de complexidade O(2n) é dito ter complexidade
exponencial.
• Geralmente não são úteis sob o ponto de vista prático.
• Quando n é 20, o tempo de execução é cerca de 1 milhão.
• Quando n dobra, o tempo fica elevado ao quadrado.
Exemplo:
– Algoritmo do Caixeiro Viajante
Principais Classes de Problemas
• f(n) = O(n!)
• Um algoritmo de complexidade O(n!) é dito ter complexidade
exponencial, apesar de O(n!) ter comportamento muito pior do
que O(2n).
• Geralmente ocorrem quando se usa força bruta na solução do
problema.
• n = 20 → 20! = 2432902008176640000, um número com 19
dígitos.
• n = 40 → um número com 48 dígitos.
• Por exemplo, um algoritmo de força bruta que acha
os divisores de um número natural n enumera todos os inteiros
de 1 até a raiz quadrada de n, e os checa para saber se
dividem n sem deixar resto.
Algoritmo exponencial x polinomial
84