You are on page 1of 31

NOÇÕES DE ANÁLISE DE

COMPLEXIDADE
ALVARO A. F. DE SOUZA
AEDS 1 - AULA 2
NOTAÇÃO ASSINTÓTICA
A notações que usamos para descrever o tempo de
execução assintótica de um algoritmo são definidas em
termos de funções cujos domínios são o conjunto dos
números naturais N ={0,1,2,...}.

Tais notações são convenientes para descrever a função


do tempo de execução do pior caso T(n), que em geral é
definida somente sobre tamanho de entrada de inteiros.
NOTAÇÃO ASSINTÓTICA
É importante entender o significado preciso da
notação para que quando houver um abuso
em seu uso, ela não seja mal utilizada.
NOTAÇÃO
Também conhecido como limite assintótico firme.

Ao analisarmos o tempo de execução do algoritmos de ordenação por


inserção, verificar-se-a que o algoritmos tem o tempo médio de execução de
T(n) = (n²), o que quer dizer que no caso médio ele executa em n² onde n é o
número de entradas.

Não vale para qualquer entrada de dados.


NOTAÇÃO
(g(n)) = {f(n): existem constantes
positivas c1, c2 e n0 tais que 0≤c1g(n)
≤c2g(n) para todos n≥n0}

Uma função f(n) pertence ao conjunto


(g(n)) se existem constantes c1 e c2
tais que ela possa ser “imprensada”
entre c1g(n)e c2g(n), para um valor n
suficientemente grande.
NOTAÇÃO
A definição de (g(n)) exige que todo membro f(n) ∈ (g(n)) seja
positivo para um determinado n suficientemente grande.

Vamos usar a definição formal para mostrar que ½n²-3n = (n²)

c1n² ≤ ½n²-3n ≤ c2n² , n≥n0. A divisão por n² produz

c1 ≤ ½- 3/n ≤ c2 Fazendo:

c1 ≤ ½- 3/n

c2≥ ½- 3/n
NOTAÇÃO
c2≥ ½- 3/n n ≥ 1 pois para qualquer
a desigualdade é válida para
valor menor que 1, -3/n cresce em módulo n ∈ ℕ. Temos que ½ ≥
½ - 3/n n ∈ ℕ é verdadeiro logo podemos tomar c2 com valor de ½
logo temos c2=½ .

c1 ≤ ½- 3/n c1 -½ ≤ - 3/n n ≥ 3/(½ -c1) para satisfazer a


desigualdade c1 <½ tomando c1=1/14 por exemplo temos que

1/14 ≤ ½ - 3/n 1/14 - ½ ≤ -3/n n ≥ 7. Dessa forma temos que


c1=1/14, c2=½ e n0=7 .
NOTAÇÃO
NOTAÇÃO
A notação limita assintoticamente
uma função acima e abaixo. Quando
temos um limite superior , usamos a
notação que é um limite
assintótico superior.

Para uma dada função g(n), denotamos


(g(n)) o conjunto das funções:

(g(n)) = {f(n): existem constantes


positivas c e n0 tais que 0≤f(n)≤cg(n)
Para todos os valores n à direita de n0 o valor
para todo n≥n0}
da função f(n) está em ou abaixo de cg(n).
NOTAÇÃO
Usando a notação, podemos descrever frequentemente o tempo de
execução de um algoritmo apenas inspecionando a estrutura global
do algoritmos.

Por exemplo, a estrutura de loop duplamente aninhado do algoritmo de


ordenação por inserção, produz imediatamente um limite superior (n²)
sobre o tempo de execução do pior caso.
OPERAÇÕES COM A NOTAÇÃO
f (n) = O(f (n))
c × O(f (n)) = O(f (n)) c = constante
O(f (n)) + O(f (n)) = O(f (n))
O(O(f (n)) = O(f (n))
O(f (n)) + O(g(n)) = O(max(f (n), g(n)))
O(f (n))O(g(n)) = O(f (n)g(n))
f (n)O(g(n)) = O(f (n)g(n))
NOTAÇÃO
Da mesma maneira que a notação
fornece um limite assintótico
superior a notação fornece um
limite assintótico inferior.

Para uma determinada função g(n),


denotamos por (g(n)) o conjunto da
funções:

(g(n)) = {f(n): existem constantes


positivas c e n0 tais que 0≤cg(n)≤f(n) Para todos os valores n à direita de n0 o valor
para todo n≥n0} da função f(n) está em ou acima de cg(n).
NOTAÇÃO
O limite assintótico fornecido pela notação pode se ou não
assintoticamente restrito. O lmite 2n² = (n²) é assintoticamente restrito,
mas o limite 2n = (n²) não o é.

(g(n)) = {f(n): para qualquer constante positiva c>0 existe uma


constante n0>0 tal que 0≤f(n)≤cg(n) para todo n≥n0}.

Por exemplo 2n= (n²), mas 2n² ≠ (n²)

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


relação a g(n) a medida que se aproxima do infinito.

Limite de f(n)/g(n) quando n→ infinito é igual a zero.


NOTAÇÃO
Por analogia a notação está para a notação assim como a notação
está para a notação . Usamos a notação para denotar um limite
inferior que não é assintoticamente restrito. f(n) ∈ (g(n)) se e
somente se g(n) ∈ (f(n))

Formalmente definimos (g(n)) como o conjunt:

(g(n)) = {f(n): para qualquer constante positiva c > 0 existe uma


constante n0>0 tal que 0≤cg(n)≤f(n) para todo n≥n0}. Por exemplo:

n²/2= (n), mas n²/2= (n²)


RELAÇÃO ASSINTÓTICA
A seguinte hierarquia de funções pode ser definida do ponto de
vista assintótico:

nn > n! > 2n > n³ > n² > n log n > n > log n > 1
OPERAÇÕES RELEVANTES
CLASSES DE COMPORTAMENTO ASSINTÓTICO
f(n)=O(1) : O uso do algoritmo independe do tamanho de n. As instruções do
algoritmo são executadas um número fixo de vezes.

f(n)=O(log(n)): Ocorre tipicamente em algoritmos que resolvem um problema


transformando-o em problemas menores. Ex:Algoritmo de pesquisa binária.

f(n)=O(n): Em geral, um pequeno trabalho é realizado sobre cada elemento


de entrada.
Esta é a melhor situação possível para um algoritmo que tem que
processar/produzir n elementos de entrada/saída.
Cada vez que n dobra de tamanho, o tempo de execução também dobra.
Ex: Algoritmo de pesquisa sequencial
CLASSES DE COMPORTAMENTO ASSINTÓTICO
f(n) = O(n log n)
-Este tempo de execução ocorre tipicamente em algoritmos que resolvem
um problema quebrando-o em problemas menores, resolvendo cada um
deles independentemente e depois agrupando as soluções.
-Caso típico dos algoritmos baseados no paradigma divisão-e-conquista.
Ex: Algoritmos de ordenação MergeSort
CLASSES DE COMPORTAMENTO ASSINTÓTICO
f(n)=O(n²)
-Algoritmos desta ordem de complexidade ocorrem quando os itens de dados
são processados aos pares, muitas vezes em um anel dentro do outro
– Para n= 1 000, o número de operações é da ordem de 1 000 000.
– Sempre que n dobra o tempo de execução é multiplicado por 4.
– Algoritmos deste tipo são úteis para resolver problemas de tamanhos
Relativamente pequenos.
Exemplos:
– Algoritmos de ordenação simples como seleção e inserção.
CLASSES DE COMPORTAMENTO ASSINTÓTICO
f(n) =O(n³)
– Algoritmos desta ordem de complexidade geralmente são úteis apenas para
resolver problemas relativamente pequenos.
– Para n = 100 , o número de operações é da ordem de 1 000 000
– Sempre que n dobra o tempo de execução é multiplicado por 8.
– Algoritmos deste tipo são úteis para resolver problemas de tamanhos
relativamente pequenos.
Exemplo:
– Algoritmo para multiplicação de matrizes.
CLASSES DE COMPORTAMENTO ASSINTÓTICO
f(n) = O(2n)
– Algoritmos desta ordem de complexidade não são úteis sob o ponto de
vista prático.
– Eles ocorrem na solução de problemas quando se usa a força bruta para
resolvê-los.
– Para n = 20 , o tempo de execução é cerca de 1 000 000.
– Sempre que n dobra o tempo de execução fica elevado ao quadrado.
Exemplo:
– Algoritmo do Caixeiro Viajante
CLASSES DE COMPORTAMENTO ASSINTÓTICO
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.

Considerando:
–n= 20, temos que 20! = 2432902008176640000 , um número com 19 dígitos.
–n= 40 temos um número com 48 dígitos.
FUNÇÃO DE COMPLEXIDADE
● Usa um modelo matemático baseado em um computador idealizado.
● Deve ser especificado o conjunto de operações e seus custos de
execuções.
● É mais usual ignorar o custo de algumas das operações e considerar
apenas as operações mais significativas.
Por exemplo, algoritmos de ordenação:
consideramos o número de comparações entre os elementos do conjunto a
ser ordenado e ignoramos as operações aritméticas, de atribuição e
manipulações de índices, caso existam.
FUNÇÃO DE COMPLEXIDADE
● Para medir o custo de execução de um algoritmo é comum definir uma
função de custo ou função de complexidade f .
● f (n) é a medida do tempo necessário para executar um algoritmo para um
problema de tamanho n.
● Função de complexidade de tempo: f (n) mede o tempo necessário para
executar um algoritmo em um problema de tamanho n.
● Função de complexidade de espaço: f (n) mede a memória necessária para
executar algoritmo em um problema de tamanho n.
● Utilizaremos f para denotar uma função de complexidade de tempo.
● A complexidade de tempo na realidade não representa tempo diretamente,
mas o número de vezes que determinada operação considerada relevante é
executada.
OPERAÇÕES RELEVANTES
Operações aritméticas

Comparações

Atribuições

Resolver um ponteiro ou referência

Indexação em um arranjo

Chamadas de retornos de funções


ANÁLISE DE COMPLEXIDADE
ANÁLISE DE COMPLEXIDADE
ANÁLISE DE COMPLEXIDADE
ANÁLISE DE COMPLEXIDADE
ANÁLISE DE COMPLEXIDADE

You might also like