Você está na página 1de 84

EN05174 - ANALISE DE ALGORITIMOS

Crescimento de Funções – Ordens Assintóticas

Prof. Dr. Lidio Mauro Lima de Campos


limadecampos@gmail.com

Universidade Federal do Pará – UFPA


ICEN/FACOMP
1
Agenda
• Comparação entre complexidades
• Como medir o custo de execução de um algoritmo?
• Ordem Assintóticas
• Cota Assintótica Superior (CAS)
• Análise Assintótica de Algoritmos
• Comparação assintótica de funções
• Dominação Assintótica
• Notações Assintóticas:
• O (Big-O), Ω (ômega), Θ (Theta), Uso e relação entre as notações O, Ω e Θ.
• o(Little-o) e w (Little-Omega)
• Propriedades
• Classes de Comportamento Assintótico
2
Comparação entre complexidades
• Um problema pode ter mais de um algoritmo para resolvê-lo. Qual
deles escolher?

• De maneira geral, consideremos um conjunto A de algoritmos para


um dado problema ∏.

• A cada algoritmo a ∈ A temos associado a função custo.

• Frequentemente, interessa-nos identificar um algoritmo ótimo, ou


seja, um algoritmo o, tal que custo(o) é menor do que custo(a) para
todo a ∈ A.
3
Como medir o custo de execução de um algoritmo?
• O parâmetro n (tamanho do problema) fornece uma medida da
dificuldade para se resolver o problema.

• Para valores suficientemente pequenos de n, qualquer algoritmo


custa pouco para ser executado, mesmo os ineficientes.

• A escolha do algoritmo não é um problema crítico para


problemas de tamanho pequeno.

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.

• É feita uma analise assintótica do problema, em outras palavras,


considera-se grandes valores nas instâncias.

• O algoritmo B com g(n) = 2n (exponencial) sequer pode ser


considerado um algoritmo eficiente, já que sua complexidade no
tempo não e limitada por um polinômio.

6
Complexidade assintótica
• A complexidade assintótica é definida pelo crescimento da
complexidade para entradas suficientemente grandes.

• Um algoritmo assintoticamente mais eficiente é melhor para todas


as entradas, exceto para entradas relativamente pequenas;

• Esta complexidade é comumente denotada através de uma COTA;


• As cotas são maneiras de reduzir detalhes realçando apenas os aspectos relevantes de
eficiência.

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.

• Para introduzir as ideias, imaginamos um algoritmo, digamos de busca, cuja complexidade é


dada por 4n+5.

• Desejamos simplificar essa expressão para entradas de tamanho grande.


• 1)Vemos que para valores grandes de n, a parcela linear 4n, torna-se dominante face à
parcela constante 5, podemos desprezar essa parcela face à primeira.
• A diferença entre 4n+5 e 4n é 5, e essa diferença percentual decresce à medida que n
cresce.
• Assim, pode-se simplificar 4n+5 para 4n.
8
Ordem Assintóticas
• Desejamos simplificar essa expressão para entradas de tamanho grande.

• 2)Em seguida, notamos que a expressão 4n cresce mais rapidamente do que


n, mas sua razão é uma constante 4.

• Uma tal razão constante é similar à que ocorre por uma mudança de
escala (como quando se passa de centímetros a polegadas).

• Desse modo, vamos simplificar 4n para n, a menos uma constante


multiplicativa, elas apresentam o mesmo crescimento assintótico.

9
Ordem Assintóticas
• O estudo assintótico permite “jogar para debaixo do tapete” os
valores das constantes e os termos não dominantes.

• De um modo geral, podemos nos concentrar nos termos dominantes e


esquecer os demais.

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”).

• Essa comparação só leva em conta a “velocidade de crescimento”


das funções.
• Assim, ela despreza fatores multiplicativos (pois a função 2n2,
por exemplo, cresce tão rápido quanto 10n2) e despreza valores
pequenos do argumento.

• A função n2 cresce mais rápido que 100n, embora n2 seja menor


que 100n quando n é pequeno).

• Dizemos que esta maneira de comparar funções é assintótica. 11


Comparação assintótica de funções
• Ao ver uma expressão como n+10 ou n²+1, a maioria das pessoas pensa
automaticamente em valores pequenos de n, próximos de zero.

• A análise de algoritmos faz exatamente o contrário: ignora os valores pequenos


e concentra-se nos valores enormes de n.

• Para esses valores, as funções: n² , (3/2)n² , 9999n² , n²/1000 , n²+100n , etc.


crescem todas com a mesma velocidade e portanto são todas "equivalentes“.

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 .

• Em geral define-se que g é uma cota assintótica superior para


f(abreviadamente CAS) sse:

• (ⱻ 𝑛𝑜 є Ν )(Ɐ n ≥ 𝑛𝑜 ) : f(n)≤g(n)

• Isso significa que, para n grande , g(n) domina f(n)


14
Fundamentos Matemáticos - Cota Assintótica Superior (CAS)
• Uma função que sempre domina outra ( como n2 ≥ n) é uma CAS, mas isso não
é necessário basta que g(n) domine f(n) para n suficiente grande.
• Exemplo 1: Considerando as funções:
• f(n)=n+4 e g(n)=n2 para n=0,1,2 temos f(n)>=g(n) , mas para n ≥3, temos
f(n) ≤ g(n) n n+4 n2
0 4 0
1 5 1
2 6 4
3 7 9
4 8 16
5 9 25
6 10 36
7 11 49
8 12 64
9 13 81
10 14 100

• 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.

n n+5 3*n^2 2^n


0 5 0 1
1 6 3 2
2 7 12 4
3 8 27 8
4 9 48 16
5 10 75 32
6 11 108 64
7 12 147 128
8 13 192 256
9 14 243 512
10 15 300 1024

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.

• Definição: Uma função f(n) domina assintoticamente outra função g(n) se


existem duas constantes positivas c e m tais que, para n ≥ m, temos
c.f(n)
|g(n)|≤ c × |f(n)|, n grande. g(n),f(n) g(n)

17
Dominação Assintótica
Exercício 2:
-Sejam g(n)=(n+1)2 e f(n)=n2 , |g(n)|≤ c × |f(n)|

Quem domina quem???


∣(n+1)2∣ ≤ ∣cn2∣ (1)
mas para isso basta ∣(n+1)∣ ≤| 𝑐𝑛|

Se 𝑐 = 2, ou seja, c=4, isso é verdade, para n ≥ 1


n |n+1| (𝒄, 𝑐 ) ∣(n+1)∣ ≤| 𝑐𝑛|
f(n)=
0 1 (0,0) (1,1) (2,1.4) Não Satisfeita
1 2 (0,0)(1,1)(2,1.4)(3,1.7)(4,2) Satisfeita para
𝑐 = 2, ou seja, c=4

g(n)= (𝑛 + 1)2 ≤ 4. 𝑛2 para n≥1,


f(n) domina g(n), para n ≥ 1 18
Dominação Assintótica
Exercício 2:
-Sejam g(n)=(n+1)2 e f(n)=n2
-Já que:
(𝑛 + 1)2 ≤ 4. 𝑛2 para n≥1 , como mostrado na
transparência anterior. Verifique o inverso

|f(n)|≤ c × |g(n)|
Para m = 0, c = 1
𝑛2 ≤ (𝑛 + 1)2 para n≥0

g(n) domina f(n)

-As funções g(n) e f(n) dominam assintoticamente uma a


outra uma a outra.

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) .

• Escreve-se f(n) = O(g(n))


• Lê-se: "f(n) é da ordem no máximo g(n)".

• A notação O define uma cota assintótica superior à menos de


constantes.

• Escrevemos g(n) = O(f(n)) para expressar que f(n) domina


assintoticamente g(n).

• Lê-se g(n) é da ordem no máximo f(n). 20


Notação Ο (ômicron grego maiúsculo) (big O)
• Exercício 3, a função quadrática g(n)=n2 cresce mais rapidamente do que a linear
f(n)=7n+13 (a partir de certo ponto).
• Dizemos que a função linear f(n) é O(g(n)).
• n≥1, c≥20
n 7n+13 cn2
1 20 20
2 27 80
3 34 180
4 41 320
5 48 500
6 55 720
7 62 980
8 69 1280
9 76 1620
10 83 2000
11 90 2420
12 97 2880
13 104 3380
14 111 3920
15 118 4500
16 125 5120
17 132 5780
18 139 6480
19 146 7220
20 153 8000

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

Devemos comparar cada elemento A[j] com cada elemento do


subarranjo ordenado inteiro, A[1..j-1], e então tj=j.
=j

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:

• O(g(n))={f(n): existem constantes positivas c e 𝑛𝑜 , tais que:


0≤f(n)≤c.g(n) para n≥𝑛𝑜 }
c e 𝑛𝑜 são constantes positivas

• Significado: c·g(n) é um limite superior de f(n) para valores grandes de n.

• A notação Big-O define o limite assintótico superior sobre uma função f(n).

• Normalmente usada para limitar o tempo de execução do pior caso de um


algoritmo. 26
Notação Ο (ômicron grego maiúsculo) (big O)
• Escrevemos f(n)=O(g(n)) para indicar que uma função de f(n) é membro do
conjunto O(g(n)). Observe que f(n)= Θ(g(n)) implica f(n)=O(g(n)), já que a
notação Θ(g(n)) Ϲ O(g(n)).
• f(n) = O(g(n)) – algum múltiplo constante de g(n) é um limite Assintótico
superior para f(n).

27
Notação Ο (ômicron grego maiúsculo) (big O)
• Onde vou usar Isso?

• 1)Muitas vezes calcular a função de complexidade f(n) de um algoritmo A é


complicado.

• É mais fácil determinar que f (n) é O(g(n)), isto é, que assintoticamente f(n) cresce no
máximo como g(n).

• Usando notação O podemos descrever frequentemente o tempo de execução de um


algoritmo apenas inspecionando a estrutura global do algoritmo (continua).

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.

• Ordenação por inserção


• PIOR CASO: Se a sequência está ordenada ao contrário (por ordem decrescente).

• O ciclo exterior executa n−1 vezes


• Os ciclos interiores executam 1,2,…,n−1 comparações
• Logo:

• 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)

• O ciclo exterior executa n−1 vezes


• O ciclo interior while termina imediatamente (1)

• x = vec[i]
• j = i-1;
• while(j>=0 && vec[j] > x)
• // vec[j] > x é FALSO

• Neste caso o algoritmo efetua 1.(n−1) comparações. Θ(n)


• continua
Notação Ο (ômicron grego maiúsculo) (big O)
• 0(n2) para o tempo de execução do pior caso do algoritmo de inserção.

• Tecnicamente, é uma abuso dizer que o tempo de execução da ordenação por


inserção é 0(n2) , visto que, para um dano n, o tempo de execução real varia,
dependendo da entrada especifica de tamanho n.

• Quando afirmamos que “o tempo de execução é 0(n2), queremos dizer que


existe uma função f(n) que é 0(n2) tal que, para qualquer valor de n, não
importando qual entrada de tamanho n seja escolhida, o tempo de
execução para essa entrada tem um limite superior determinado pelo valor
de f(n). De modo equivalente dizemos que o tempo de execução no pior
caso é O(n2).
Notação Ο (ômicron grego maiúsculo) (big O)
• 2)Comparar dois algoritmos na solução de um problema
3)Normalmente usada para limitar o tempo de execução do pior caso de um algoritmo.
Descreve o tempo de execução do Alg. No pior caso. Por exemplo O(n2 ) é o limite no
tempo de execução do pior caso da ordenação por inserção.
--------
• Pior caso: Vetor possui os Elementos em Ordem Decrescente
O(n2 )
• Mehor Caso: Vetor em ordem crescente
f(n)=n-1
------------

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)

• n1.5 está em O(n2)


• n1.5 ≤cn2 (dividindo por 𝑛3/2 )
• 1≤cn0.5 , para n≥1,c ≥1

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

• Resumindo g(n) ≤4.f(n)


• Portanto, g(n)=O(f(n))

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 .

• O teorema a seguir é útil para calcular limites quando f e g são funções


contínuas é diferenciáveis em R* (R+ U {0}) , reais positivos incluindo o zero.

• Teorema 1: Regra de L ’Hospital


𝒇(𝒏) 𝒇´(𝒏)
• If lim f(n)= lim g(n)= ∞, então lim = lim , se as derivadas f’ e g’
𝒏→∞ 𝒏→∞ 𝒏→∞ 𝒈(𝒏) 𝒏→∞ 𝒈´(𝒏)
existem.
42
Técnica alternativa para mostrar que g está em O(f)
𝑛3
• Exercício 13: Considere f(n)= e g(n)=37𝑛2 + 120𝑛 + 17. Iremos mostrar que g
2
ε O(f) , mas g Ɇ O(g).

• Desde que para n≥78, g(n)<1f(n), então segue que g ε O(f) .

• Pode-se ter a mesma conclusão de:


𝒈(𝒏)
• g ε O(f) se lim = 𝒄 , para algum c ε R* .
𝒏→∞ 𝒇(𝒏)
𝒈(𝒏) 37𝑛2 +120𝑛+17 74 240 34
• lim = lim 𝑛3
= lim ( + + ) =0=c
𝒏→∞ 𝒇(𝒏) 𝒏→∞ 𝒏→∞ 𝑛 𝑛2 𝑛3
2
𝑓
• Pode-se deduzir que f Ɇ O(g) observando que o limite = ∞.
𝑔

• 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≥ 𝑛𝑜 }

• Em alguns casos podemos analisar o limite assintótico inferior para expressar


que algo esteja “pelo menos” em um dado comportamento.
• Significado: c·g(n) é um limite inferior de f(n) para n grande. 48
Notação Ω (ômega)
• Notação Ω - é o limite assintótico inferior da ordem de crescimento de uma
função f(n).
• Ω(g(n))={f(n) : existem constantes positivas c e 𝒏𝒐 tais que 0≤c.g(n)≤f(n) para
todo n≥ 𝒏𝒐 }

• Quando dizemos que o tempo de execução de um algoritmo é Ω(g(n)) ,


queremos dizer não importando qual entrada especifica de tamanho n seja
escolhida para cada valor de n, o tempo de execução para a entrada é no
mínimo uma constante vezes g(n) n→∞.

• De um modo equivalente, estamos dando, um limite inferior para o tempo de


execução do MELHOR CASO de um algoritmo.
• Por exemplo o tempo de execução para o melhor caso da ordenação por inserção é Ω(n).
49
Notação Ω (ômega)
• Notação Ω - é o limite assintótico inferior da ordem de crescimento de uma
função f(n).

• Portanto o tempo de execução da ordenação por inserção pertence as funções


Ω(n) e O(n2) já que ela se encontra em qualquer lugar entre uma função linear
de n e uma quadrática de 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)

• Notação Θ - é o limite assintótico firme ou justo ou restrito da ordem de


crescimento da função de custo.

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≥ 𝑛𝑜 }

• Dizemos que g(n)=Θ(f(n)) se existirem duas constantes 𝒄𝟏 e 𝒄𝟐 e m tais que,


para todo n≥𝑛𝑜 , o valor de f(n) está sobre ou acima de 𝒄𝟏 𝒈(n) e sobre ou abaixo
de 𝒄𝟐 g(n).
• Nesse caso, g(n) é um limite assintótico restrito para f(n). 55
Notação Θ (theta)
𝒏𝟑
• Exercício 21: Seja f(n)= − 𝟐𝒏, mostrar que f(n) é Θ(g(n)=n2) .
𝟑
𝒏𝟑
• Temos de obter 𝒄𝟏 , 𝒄𝟐 e m tais que:𝒄𝟏 .n2 ≤ − 𝟐𝒏 ≤ 𝒄𝟐 .n2 , para todo n≥𝑛𝑜
𝟑
• Θ(g(n))=
• {f(n) : se existirem constantes 𝒄𝟏 , 𝒄𝟐 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

• Estamos afirmando que:


• No pior caso: T(n) = Θ(n2) (Theta de n ao quadrado), pois possui complexidade
quadrática.
• No melhor caso: T(n) = Θ(n) (Theta de n), pois possui complexidade linear.

• Isso significa que o algoritmo A possui um limite assintótico frouxo, visto


que, no geral, o seu desempenho se comporta de forma distinta para o
melhor e pior caso.
• Ou seja, ele, no geral, é O(n2) e Ω(n).
63
Notação Θ (theta)
• Limite assintótico rígido
• Quando afirmamos que o algoritmo B possui:
• No pior caso: T(n) = 4n+1
• No melhor caso: T(n) = 3n+2
• Estamos afirmando que:
• No pior caso: T(n) = Θ(n) (téta de n), pois possui complexidade linear.
• No melhor caso: T(n) = Θ(n) (téta de n), pois possui complexidade linear.

• 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>𝑛𝑜 }

• Análise por Limites:


• Informalmente, dizemos que, se f(n) ∈ o(g(n)), então f(n) cresce mais
lentamente que g(n).

• Intuitivamente, na notação o, a função f(n) torna-se insignificante em relação


a g(n) quando n tende para o infinito.

• 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

7 98 343 1 343 VERDADEIRO 1500


8 128 512 1 512 VERDADEIRO 1000
9 162 729 1 729 VERDADEIRO 500
10 200 1000 1 1000 VERDADEIRO 0
11 242 1331 1 1331 VERDADEIRO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
12 288 1728 1 1728 VERDADEIRO 2n2 cn3
13 338 2197 1 2197 VERDADEIRO
14 392 2744 1 2744 VERDADEIRO
15 450 3375 1 3375 VERDADEIRO

Por limites: lim n →∞ (f(n)/g(n)) = lim n →∞ (2n2 /n3) =0

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

7 686 343 1 343 FALSO 4000


8 1024 512 1 512 FALSO 3000
9 1458 729 1 729 FALSO 2000
10 2000 1000 1 1000 FALSO 1000
11 2662 1331 1 1331 FALSO 0
12 3456 1728 1 1728 FALSO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
13 4394 2197 1 2197 FALSO
2n3 cn3
14 5488 2744 1 2744 FALSO
15 6750 3375 1 3375 FALSO

Por limites: lim n →∞ (f(n)/g(n)) = lim n →∞ (2n3 /n3) =2

• 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>𝑛𝑜 }

• A relação f(n)=w(g(n)) implica que:


𝒇(𝒏)
• lim = ∞, se o limite existir
𝒏→∞ 𝒈(𝒏)

𝑛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)

• Algoritmos de complexidade O(1) são ditos de complexidade


constante.
• Uso do algoritmo independe de n.
• As instruções do algoritmo são executadas um número fixo de
vezes.

• Exemplo: Determinar se um número é par.


Principais Classes de Problemas
• f(n) = O(log n)
• Um algoritmo de complexidade O(log n) é dito ter complexidade
logarítmica.
• Típico em algoritmos que transformam um problema em outros
menores.
• Quando n é 103 (mil), 𝒍𝒐𝒈𝒏𝟐 ≈ 10, quando n é 106 (um milhão),
𝒍𝒐𝒈𝒏𝟐 ≈ 20.
• Para dobrar o valor de log n temos de considerar o quadrado
de n.
• A base do logaritmo muda pouco estes valores: quando n é 1
𝒏 𝒏
milhão , o 𝒍𝒐𝒈𝟐 ≈ 20 e o 𝒍𝒐𝒈𝟏𝟎 ≈ é 6.

• Exemplo: Algoritmo de pesquisa binária.


Principais Classes de Problemas

•f(n) = O(n)

•Um algoritmo de complexidade O(n) é dito ter


complexidade linear.
•Em geral, um pequeno trabalho é realizado sobre
cada elemento de entrada.
•Cada vez que n dobra de tamanho, o tempo de
execução dobra.

•Ex: Algoritmo de Pesquisa Sequencial


Principais Classes de Problemas

• f(n) = O(n log n)


• Típico em algoritmos que quebram um problema em
outros menores, resolvem cada um deles
independentemente e ajuntando as soluções depois.

𝒏
• 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.

• Algoritmo de ordenação MergeSort, quicksort (melhor


caso).
Principais Classes de Problemas

• 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

• Algoritmo exponencial no tempo de execução tem função de


complexidade O(cn) c > 1.
• Algoritmo polinomial no tempo de execução tem função de
complexidade O(p(n)), onde p(n) é um polinômio.
• A distinção entre estes dois tipos de algoritmos torna-se significativa
quando o tamanho do problema a ser resolvido cresce.
Algoritmo exponencial x polinomial
• A distinção entre algoritmos polinomiais eficientes e algoritmos
exponenciais ineficientes possui várias exceções.
• Exemplo: um algoritmo com função de complexidade f(n) = 2n é
mais rápido que um algoritmo g(n) = n5 para valores de n menores
ou iguais a 20.
• Também existem algoritmos exponenciais que são muito úteis na
prática.
• Exemplo: O algoritmo Simplex para programação linear possui
complexidade de tempo exponencial para o pior caso mas
executa muito rápido na prática.
Técnicas de análise de algoritmos
• Determinar o tempo de execução de um programa pode ser um
problema matemático complexo.
• A análise utiliza técnicas de matemática discreta, envolvendo
contagem ou enumeração dos elementos de um conjunto:
• manipulação de somas;
• produtos;
• permutações;
• fatoriais;
• coeficientes binomiais;
• solução de equações de recorrência.
Referências
• Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein.
Algoritmos – Teoria e Prática, Tradução da Segunda Edição. Campus, 2016.
• Ziviani, N. Projeto de Algoritmos Com Implementações em Pascal e C, Pioneira
Thomson Learning, 4ed. 2009.
• J. Kleinberg e E. Tardos. Algorithm Design. . Addison Wesley. 2005.
• Baase , Sara. Computer Algotithms. Introduction to Design and Analysis .
Addison-Wesley. 2003.
• Neto, N. C. Sampaio. Notas de Aula, P.A. Algoritmos, 2021.

84

Você também pode gostar