Você está na página 1de 10

Projeto e Complexidade de Algoritmos - Aula 3

Universidade de Brasília
Departamento de Ciência da Computação
Profa . Dra . Maria Emília Teles Walter

22/4/2011

3 Crescimento de Funções
3.1 Ordem de crescimento do tempo de execução do algo-
ritmo
- Caracterização simples da eficiência do algoritmo;
- Permite comparar custos de tempo de algoritmos diferentes para um mesmo
problema;

Exemplo: Considerando o tamanho da entrada, n, grande o suficiente, para


os seguintes algoritmos temos:


Merge-sort tempo de execução do pior caso Θ(n lg n);
Insertion-sort tempo de execução do pior caso Θ(n2 ).

3.2 Precisão
Podemos determinar, precisamente, o tempo de execução de um algoritmo.
(ex.: Insertion-sort no capítulo 1), mas:

- O esforço de computar precisamente: não acrescenta muita informação;


- Considerando entradas grandes o suficiente:



 As constantes multiplicativas do termo de maior ordem, Não Influenciam;

→

Os termos de menor ordem, Não Influenciam;

 → O tempo de execução é dominado pelo termo de maior ordem.



(função do tamanho da entrada).

⇒ Apenas a ordem de crescimento é relevante para a eficiência assintótica


dos tempos de execução dos algoritmos, ou seja, como o tempo de execução

1
de um algoritmo cresce com o tamanho da entrada, no limite, quando o
tamanho da entrada cresce ilimitadamente;
⇒ Um algoritmo assintoticamente mais eficiente é melhor do que um outro
algoritmo mais eficiente para entradas pequenas. Estudaremos métodos
para simplificar a análise assintótica dos algoritmos.

3.3 Notação assintótica


A notação assintótica para o tempo de execução de um algoritmo:

- Definida em termos de funções com domínio; N = {0, 1, 2, ...}.;


- Conveniente para determinar a função T (n);



Descreve o tempo de execução do pior caso;
→ Definida para tamanhos de entrada inteiros.

3.4 notação-Θ
Dada uma função g(n) e considerando n suficientemente grande:

• Θ(g(n)) = {f (n) se ∃ constantes positivas c1 , c2 , n0 | 0 ≤ c1 g(n) ≤ f (n) ≤


c2 g(n) ∀ n ≥ n0 };
• f (n) ∈ Θ(g(n)) se ∃ constantes positivas c1 e c2 | f (n) fica limitada entre c1 g(n) e c2 g(n).

Figura 1: f (n) = O(g(n))

Analisado a figura 1 e considerado um n grande o suficiente:


(
≤ c2 g(n), n ≥ n
f (n) = Com n grande o suficiênte
≥ c1 g(n), n ≥ n
Então:

2
→ Com c1 g(n) abaixo de f (n) e acima de c2 g(n), para n ≥ n0 .
→ Com n ≥ n0 , f (n) = g(n) por fator constante.
→ g(n) é limite assintoticamente perto de f (n).

Por definição, para não-negativa para n suficientemente grande:


(
f (n) = Θ(g(n)) assintoticamente não-negativa
Θ=
g(n)assintoticamente não-negativa, (senão Θ(g(n)) seria vazio);

3.5 Exemplo 1
Ignoramos termos de menor ordem e coeficiente do termo de maior ordem
justificando esse fato:
1 2
n − 3n = Θ(n2 )
2
Determinar constantes c1 , c2 , n0 , tal que:
1 2
c1 n2 ≤ n − 3n ≤ c2 n2
2
Para todo n ≥ n0 , dividindo por n2 :
1 3
c1 ≤ − ≤ c2
2 n
Com n → ∞
1 3 1
h(n) = − , n → ∞ : h(n) =
2 n 2
Para h(n) ≤ c2 ? Basta tomar:
1
c2 ≥ en ≥ 1.
2
Para c1 ≤ h(n)? Basta tomar:
1 o
c1 ≥ 0, h(6) = 0, h(7) = , 1 positivo.
14
Então basta tomar:
1
c1 ≤ en≥7
14
Assim:
1 2 1 1
0≤ n ≤ n2 − 3n ≤ n2 , ∀ ≥ 7,
14 2 2
e
1 2
n − 3n = Θ(n2 )
2

3
3.6 Exemplo 2

6n3 6= Θ(n2 )
Supor, por contradição, que existem:

c2 e n0 | n3 ≤ c2 n2 , ∀n ≥ n0 .

c2
(÷n2 ) : 6n ≤ c2 → n ≤
6
Não vale para valores de n arbitrariamente grandes, pois, c2 é constante.
Intuitivamente: termos de menor ordem de uma função assintoticamente
positiva podem ser ignorados quando determinados limites próximos, pois, não
são significativos para n grande.

• parte pequena do termo de maior ordem é suficiente para dominar os


termos de menor ordem;
– associar a c1 um valor um pouco menor do que o coeficiente do termo
de maior ordem;
– associar a c2 um valor um pouco maior do que o coeficiente do termo
de maior ordem;
– permite satisfazer às desigualdades da definição da notação-Θ;
• o coeficiente do termo de maior ordem pode ser ignorado: ele apenas muda
c1 e c2 por uma constante igual a ele (coeficiente).

3.7 Exemplo 3

f (n) = an2 + bn + c | a,b,c são constantes e a > 0, f (n) = Θ(n2 )

Tomando
a 7a
c1 = , c2 =
4 4
e r
|b| |c|
n0 = 2max( , )
a a
temos:
a 2 7a 2
0≤ n ≤ an2 + bn + c ≤ n ,
4 4
Para todo n ≥ n0 .
Resolvendo uma parte do exercício:

4
r
a b c |b| |c|
≤ a + + 2 , n ≥ 2max( , )
4 n n a a
Com:

b > 0, c > 0;


b > 0, c < 0;
a>0=
b < 0, c > 0;


b < 0, c < 0.

q
Para o caso max( |b|
a ,
|c|
a ) = |b|
a , temos:
a b c
≤ a + |b| + |b| =
4 2a (2 a )2
a ca2
=a+ + >0
2 4|b|2
q q
Sendo análogo para max( |b|
a , |c|
a ) = |c|
a .
Resolver para os outros casos.
Em geral, para qualquer polinômio:
d
X
p(n) = ai ni , ai ctes, > 0 → p(n) = Θ(nd )
i=0

Qualquer constante é um polinômio de grau 0 → podemos expressar qualquer


função constante como Θ(n0 ) = Θ(1).

3.8 notação-O



notação-Θ: limita assintoticamente uma função (acima e abaixo);
→ notação-O limite superior assintótico. Fornece limite superior de uma função, por fator constante.

O(g(n)) = {f (n)| existem constantes positivas c, n0 , |0 ≤ f (n) ≤ cg(n)∀n ≥ n0 }.

5
Figura 2: f (n) = O(g(n))

f (n) = Θ(g(n)) → f (n) = O(g(n))

Θ(g(n)) ⊆ O(g(n))

Notação-Θ é mais forte do que notação-O

⇒ Prova que toda função linear quadrática an2 + bn + c, a > 0, ∈ Θ(n2 )

⇒ Também prova que ∈ O(g(n)).

⇒ Toda função linear an + b, a > 0 ∈ O(g(n))

(
c = a + |b|
Basta Tomar = ⇒ 0 ≤ an + b ≤ (a + |b|)n2 ,
n0 = 1
Para:

n ≥ 1 → an + b = O(n2 ) ⇒ f (n) = O(g(n)) :

Um múltiplo constante de g(n) é limite superior assintótico de f (n), sem


considerar quão próximo é este limite.

6
3.9 notação-O
Avaliamos tempo de execução de um algoritmo investigando a estrutura geral
do algoritmo.
Exemplo: Insertion-Sort:

• estrutura de um laço (while) aninhando dentro de um outro laço (for ) →


limite superior O(n2 );
• no pior caso do algoritmo:
– custo de cada comando do laço mais interno limitado superiormente
por O(1) (constante);
– índices i, j ≤ n;
– cada comando do laço interno executado no máximo 1 vez para cada
um dos n2 pares de valores de i e j;

⇒ A notação-O: descreve limite superior → quando a usamos para obter o


tempo de pior caso do algoritmo, obtemos também o limite do tempo de execu-
ção do algoritmo para qualquer entrada.

Exemplo:
⇒ Temos O(n2 ) como limite superior do tempo de execução do pior caso do
Insection-Sort
⇒ Temos O(n2 ) como limite superior do tempo de execução para qualquer
entrada.
mas
⇒ Θ(n2 ) é limite do tempo de execução do pior caso do Insection-Sort
⇒ Θ(n2 ) não é o limite de tempo de execução para qualquer entrada (entrada
já ordenada possui tempo de execução Θ(n))
⇒ Técnicamente:
É um abuso dizermos que o tempo de execução do Insertion-sort é O(n2 ),
para um dado n, pois o tempo de execução depende de uma particular entrada
para um dado n.
O tempo de n não é, de fato, uma função de n.
Dizer "tempo de execução"é O(n2 ) significa:

• O tempo de execução do pior caso (que é função de n) é O(n2 ). Ou ;


• não importa uma particular entrada de tamanho n, para um dado n, o
tempo de execução no conjunto das entradas é O(n2 ).

3.10 notação-Ω
A notação-Ω fornece limite inferior assintótico:

• Ω(g(n))={f (n) / existem constantes positivas c, n0 tal que:


0 ≤ cg(n) ≤ f (n) para todo n ≥ n0 }

7
• notação-Ω: limite inferior de uma função, por um fator constante.

Figura 3: f (n) = Ω(g(n))

f (n) = Ω(g(n)) se existirem constantes positivas c, n0 tal que, à direita de


n0 , o valor de f (n) é ≥ cg(n).
Teorema:
Para quaisquer funções f (n) e g(n): f (n) = Θ(g(n)) ←→ f (n) = O(g(n)) e
f (n) = Ω(g(n)).
Prova:
Segue imediatamente das definições de notações assintóticas.

• → imediato, tomando n0 , c1 , c2 iguais;


• ← n0 = max(n0 ”O”, n0 ”Ω”) c1 , c2 iguais;

Exemplo
an2 + bn + c = Θ(n2 ) a, b, c constantes, a > 0 →
an2 + bn + c = Ω(ne ) e an2 + bn + c = O(ne )
Observação: Na prática, não usa Θ → O, Ω mas usamos o teorema na outra direção.

3.11 A notação-Ω descreve limite inferior


A notação-Ω descreve limite inferior quando usamos Ω para limitar o tempo
de execução do melhor caso de um algoritmo → usamos Ω para limitar o tempo
de execução do algoritmo para qualquer entrada.
Exemplo:
O tempo de execução do melhor caso do Insertion-Sort Ω(n) → limite inferior
do Insertion-Sort Ω(n).
Tempo de execução do Insertion-Sort: entre Ω(n) e O(n2 ).

8
Mais ainda, limites assintóticamente próximos: tempo de execução do Insertion-
Sort não é Ω(n2 ) pois ele executa em Θ(n) para entradas ordenadas. Porém,
podemos dizer que o tempo de execução do pior caso é Ω(n2 ), pois existem
entradas que levam ao tempo de Ω(n2 ).
Tempo de execução de um algoritmo: Ω(n), para qualquer entrada de tama-
nho n, o tempo de execução do algoritmo, no conjunto das entradas, custa no
mínimo uma constante vezes g(n), n suficientemente grande.

3.12 Notação assintótica em equações


Podemos usar notação assintótica dentro de fórmulas matemáticas:
EX.:
• 1) n = O(n2 )
• 2) 2n2 + 3n + 1 = 2n2 + Θ(n)

Interpretação das fórmulas:


• 1) n = O(n2 ) (notação assintótica do lado direito) significa n ∈ O(n2 )
Em geral, notação assintótica dentro da fórmula: interpretamos como função
anônima (não é importante definir precisamente)
Exemplos:
2n2 + 3n + 1 = 2n2 + Θ(n) significa 2n2 + 3n + 1 = 2n2 + f (n) onde f (n) é
uma função qualquer no conjunto Θ(n) (ex.: f (n) = 3n + 1 ∈ Θ(n)).
Notação assintótica usada desta forma: elimina detalhes não essenciais.
EX.: T (n) = 2T ( n2 ) + Θ(n) no merge-sort, queremos apenas o comporta-
mento assintótico de T (n). Não há interesse em detalhar termos de menor ordem
(nesse caso, os detalhes serão absorvidos por uma função anônima denotada pelo
termo Θ(n)).
no de funções anônimas numa expressão: no de vezes que a notação assin-
tótica aparece.
Pn
EX.: i=1 O(i): existe uma função anônima f (i) 6= O(1)+O(2)+...+O(n):
não têm uma interpretação definida.
2n2 + Θ(n) = Θ(n2 ): não importa a escolha das funções anônimas no lado
esquerdo da equação, mas existe forma de escolher funções anônimas no lado
direito da equação, tornando a equação verdadeira.
No exemplo: para qualquer função f (n) ∈ Θ(n) → existe uma função g(n) ∈
Θ(n2 ) tal que 2n2 + f (n) = g(n) para todo n.
Encadeamento de equações:

2n2 + 3n + 1 = 2n2 + Θ(n) (1)


= Θ(n2 ) (2)

• (1) existe alguma função f (n) ∈ Θ(n) tal que 2n2 + 3n + 1 = 2n2 + f (n)
para todo n.

9
• (2): para qualquer função g(n) ∈ Θ(n) (poderia ser a f (n) anterior) existe
uma função h(n) ∈ Θ(n2 ) tal que 2n2 + 3n + 1 = h(n) para todo n.

→ (1) e (2): 2n2 + 3n + 1 = Θ(n2 )


Intuitivamente: resultado do encadeamento de equações.

10

Você também pode gostar