Você está na página 1de 36

Comportamento Assinttico

Estruturas de Dados I
Tiago Carneiro
carneiro@larces.uece.br

1 Notao Assinttica 26/02/2013


Objetivos
Objetivo principal:
A anlise assinttica de algoritmos a principal maneira
de medida de eficincia de um algoritmo. Essa aula tem
como objetivo principal realizar uma apresentao
sucinta sobre comportamento assinttico de algoritmos.

2 Notao Assinttica 26/02/2013


Agenda:
Introduo
Notaes assintticas:

O,o
,
Relaes entre as notaes
Exerccios
Bibliografia sugerida

3 Notao Assinttica 26/02/2013


Introduo
Dado um problema, como encontramos um
algoritmo eficiente para sua soluo?
Como comparar este algoritmo com outros
algoritmos que solucionam o mesmo problema?
Como deveramos julgar a qualidade de um
algoritmo?
Qual o algoritmo de menor custo possvel para
resolver um problema particular?

4 Notao Assinttica 27/02/2013


Introduo
No mbito da anlise de algoritmos, existem dois
problemas principais:
1) Anlise de um algoritmo particular, que concentra-
se em descobrir qual o custo computacional para resolver
determinado problema atravs do uso de um algoritmo
especfico.
O que analisamos?
A quantidade de vezes que cada parte do algoritmo deve
ser executada.
Quantidade de memria necessria para o algoritmo em
questo resolver o problema.

5 Notao Assinttica 26/02/2013


Introduo
No mbito da anlise de algoritmos, existem dois
problemas principais:
2) Anlise de uma classe inteira de algoritmos, que preocupa-
se em saber qual o algoritmo de menor custo possvel dentre
todos os da classe.
Em muitas situaes existem muitos algoritmos que
resolvem o mesmo problema, e deve-se escolher o
melhor.
Como compar-los?

6 Notao Assinttica 26/02/2013


Introduo
Como compar-los?
Podemos executar todos os algoritmos em um
determinado computador e recolher os resultados.
Essa soluo no a prefervel, pois os resultados dependero
fortemente do hardware utilizado, compiladores, linguagens de
programao, etc.
Qual a maneira mais amplamente utilizada?
Algumas operaes do algoritmo so ignoradas, e
consideram-se apenas as operaes elementares
realizadas pelo algoritmo.
A cada operao atribudo um custo unitrio.

7 Notao Assinttica 26/02/2013


Introduo
Operaes elementares?
So os passos elementares realizados pelo algoritmo em
questo, e podem ser operaes aritmticas,
comparaes, branchings, trocas, etc.
Assume-se que cada passo elementar necessite de uma
unidade de tempo para ser realizado.
Para determinar o custo de um algoritmo, costuma-
se definir uma funo de custo, ou funo de
complexidade f, onde f(n) a medida de tempo
necessria para executar o algoritmo para dada
instncia de tamanho n.

8 Notao Assinttica 26/02/2013


Introduo
Tamanho da entrada?
Algoritmos recebem, como entrada, um input
organizado na forma de uma sequncia de smbolos. O
tamanho da entrada o tamanho dessa sequncia.
Exemplos:
Se o problema fosse de otimizao combinatria, seu
input seria um objeto combinatorial, como, por exemplo,
um grafo. O tamanho da entrada poderia ser a
quantidade de vrtices desse grafo.
Se o problema fosse de ordenao, o tamanho da
instncia seria a quantidade de elementos presente no
arranjo a ser ordenado.

9 Notao Assinttica 26/02/2013


Introduo
Funo f(n):
Se f(n) disser respeito quantidade de tempo
necessria para o algoritmo A resolver um problema de
tamanho n, essa funo dita funo de complexidade
de tempo de A.
A complexidade de tempo diz respeito, para determinada
entrada de tamanho n, quantidade de vezes que determinada
operao elementar ser realizada, em relao ao tamanho da
instncia.
Se disser respeito quantidade de memria necessria,
essa funo dita complexidade espacial de A.
Obs.: caso no seja especificada de qual complexidade
estamos tratando, subtende-se que seja a complexidade
de tempo.

10 Notao Assinttica 26/02/2013


Introduo
Obs.: o tempo de execuo, para muitos algoritmos,
no depende somente do tamanho n da entrada,
mas tambm da configurao dessa entrada.
Ex.: busca linear em um vetor
Por isso existe uma distino entre melhor caso, caso
mdio e pior caso da execuo de um algoritmo.
O melhor caso corresponde ao melhor tempo de execuo
para qualquer entrada de tamanho n.
O pior caso corresponde ao maior tempo de execuo para
todas as entradas de tamanho n.
O caso mdio uma anlise probabilstica, que diz respeito a
uma mdia dos tempos de execuo de todas as entradas de
tamanho n.

11 Notao Assinttica 26/02/2013


Comportamento assinttico de funes
O custo para que determinado algoritmo obtenha a
soluo de um problema aumenta de acordo com o
tamanho n da entrada.
O parmetro n nos fornece um uma medida de
dificuldade para resolver o problema, pois ao passo que
n cresce, o tempo necessrio para resolver o problema
tambm cresce.
Obs: Se o valor de n muito pequeno, qualquer
algoritmo pode resolver o problema em pouco
tempo.
Portanto, estuda-se o comportamento das funes
de custo para valores grandes de n, i.e., estuda-se o
comportamento assinttico das funes de custo.

12 Notao Assinttica 26/02/2013


Comportamento assinttico de funes
O custo para que determinado algoritmo obtenha a
soluo de um problema aumenta de acordo com o
tamanho n da entrada.
O parmetro n nos fornece um uma medida de
dificuldade para resolver o problema, pois ao passo que
n cresce, o tempo necessrio para resolver o problema
tambm cresce.
O comportamento assinttico de f(n) representa o
limite do comportamento do custo quando n cresce.

13 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao
Para determinada funo g(n), definimos (g(n)) como sendo o
seguinte conjunto:

(g(n)) = { f(n) :
constantes positivas c1, c2 e n0, tais que
n n0, temos 0 c1g(n) f(n) c2g(n) }

Ou seja: corresponde ao conjunto de funes com a mesma taxa


de crescimento de g(n).
g(n) um limite assintoticamente restrito para f(n)

14 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao
Obs.:
Podemos dizer que o tempo de execuo do mergesort (nlogn).
Isso significa dizer que, independente da configurao da entrada, o
mergesort possui o tempo de execuo com a mesma taxa de
crescimento de nlogn.
10n+3n = (n).
Mas 3n no pertence (n), pois possui uma taxa de crescimento
inferior de n.

Exerccio para casa: provar que 10n+3n = (n).

15 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao O (big O):
Para determinada funo g(n), definimos O(g(n)) como sendo o
seguinte conjunto:

O(g(n)) = {f(n) : constantes positivas c e


n0, tais quen n0, temos 0 f(n) cg(n) }

Ou seja: O(g(n)) corresponde ao conjunto de funes com taxa


de crescimento menor ou igual ao de g(n).
g(n) um limite superior assinttico para f(n).

16 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao O (big O):
Obs.:
Notao O utilizada para expressar o pior caso do tempo de
execuo de um algoritmo.
O quicksort O(n). Isso significa dizer que o tempo de execuo do
quicksort nunca ser pior que O(n).
Quando dizemos que o tempo de execuo de um algoritmo O(n),
afirmamos que, no importando o tamanho e a configurao da
entrada, o tempo de execuo limitado superiormente por O(n).
Funes lineares do tipo f(n)=an+b so O(n).
Mas 3n no O(n).

17 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao :
Para determinada funo g(n), definimos (g(n)) como sendo o
seguinte conjunto:
(g(n)) = {f(n) : constantes positivas c e
n0, tais que n n0, temos 0 cg(n) f(n)}

Ou seja: (g(n)) corresponde ao conjunto de funes com taxa


de crescimento maior ou igual ao de g(n).
g(n) um limite assintoticamente inferior para f(n).

18 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao :
Obs.:
Uma sendo (n) um limite inferior para o tempo de execuo, (n)
utilizado, constantemente, para informar o melhor caso de um
algoritmo.
Quicksort (nlogn).
Quando afirmamos que o tempo de execuo de um algoritmo (n),
estamos informando, no importando a configurao da entrada, que o
tempo de execuo ser, no mnimo (n).

19 Notao Assinttica 26/02/2013


Notaes Assintticas
Relaes entre , O, :
Limites assintoticamente restritos so obtidos atravs da obteno
e limites assintoticamete superiores e inferiores. Portanto:
f(n) = (g(n)) f(n) = O(g(n)).
(g(n)) O(g(n)).

f(n) = (g(n)) f(n) = (g(n)).


(g(n)) (g(n)).

(g(n)) = (g(n)) O(g(n))

Teorema 1: Para duas funes g(n) e f(n) quaisquer, f(n) = (g(n)) sss f(n)
= O(g(n)) e f(n) = (g(n)).

20 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao O (little o):
Para determinada funo g(n), definimos o(g(n)) como sendo o
seguinte conjunto:

o(g(n)) = {f(n): c > 0, n0 > 0 tal que, n n0,


temos 0 f(n) < cg(n)}.

Nesse caso g(n) um limite superior, porm no


assintoticamente restrito.
Define apenas as funes com taxas de crescimento inferiores
taxa de crescimento de g(n).

21 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao O (little o):
Para determinada funo g(n), definimos o(g(n)) como sendo o
seguinte conjunto:

o(g(n)) = {f(n): c > 0, n0 > 0 tal que, n n0,


temos 0 f(n) < cg(n)}.

O(g(n)) = {f(n) : constantes positivas c e


n0, tais quen n0, temos 0 f(n) cg(n) }

Nesse caso g(n) um limite superior, porm no


assintoticamente restrito.
Define apenas as funes com taxas de crescimento inferiores
taxa de crescimento de g(n).

22 Notao Assinttica 26/02/2013


Notaes Assintticas
Notao (little omega):
Para determinada funo g(n), definimos (g(n)) como sendo o
seguinte conjunto:

w(g(n)) = {f(n): c > 0, n0 > 0 tal que, n n0,


temos 0 cg(n) < f(n)}.

Nesse caso g(n) um limite inferior, porm no


assintoticamente restrito.
Define apenas as funes com taxas de crescimento
superiores taxa de crescimento de g(n).

23 Notao Assinttica 26/02/2013


Notaes Assintticas: propriedades
Transitividade

f(n) = (g(n)), g(n) = (h(n)) f(n) = (h(n))


f(n) = O(g(n)), g(n) = O(h(n)) f(n) = O(h(n))
f(n) = (g(n)), g(n) = (h(n)) f(n) = (h(n))
f(n) = o (g(n)), g(n) = o (h(n)) f(n) = o (h(n))
f(n) = w(g(n)), g(n) = w(h(n)) f(n) = w(h(n))

Reflexividade
f(n) = (f(n))
f(n) = O(f(n))
f(n) = (f(n))

24 Notao Assinttica 26/02/2013


Notaes Assintticas: propriedades
Simetria:

f(n) = (g(n)) sss g(n) = (f(n))

Complemento:

f(n) = O(g(n)) sss g(n) = (f(n))


f(n) = o(g(n)) sss g(n) = w((f(n))

25 Notao Assinttica 26/02/2013


Notaes Assintticas
Obs.:
Se dois algoritmos, F e G, forem aplicados a mesma
classe de problemas, mas F trs vezes mais lento que
G, i.e., f(n) = 3g(n), o comportamento assinttico no
suficiente para comparar esses dois algoritmos, uma
vez que suas funes de tempo possuem a mesma taxa
de crescimento (O(f(n)) = O(g(n)).
Para entradas pequenas, em algum cenrios, pode ser
prefervel utilizar algoritmos assintoticamente menos
eficientes. Por exemplo, um que leve tempo 100n e outro
que leve tempo 50n. O O(n) melhor que o O(n) para
instncias de tamanho at n = 50.

26 Notao Assinttica 26/02/2013


Classes de comportamento assinttico
As principais classes de problemas possuem as
funes de complexidade que seguem:
f(n) = O(1): complexidade constante, i.e., no importa o
tamanho da instncia, a quantidade de passos para
resolver o problema ser sempre constante.
f(n) = O(log n): algoritmos de complexidade logartmica.
So geralmente do tipo dividir e conquistar.
f(n) = O(n): algoritmos de complexidade linear.
f(n) = O(n^k): algoritmos polinomiais, tambm
conhecidos como eficientes ou bons algoritmos.
f(n) = O(c^n): algoritmos exponenciais.

27 Notao Assinttica 26/02/2013


Classes de comportamento assinttico
As principais classes de problemas possuem as
funes de complexidade que seguem:

28 Notao Assinttica 26/02/2013


Classes de comportamento assinttico
Algoritmos polinomiais so geralmente
conhecidos como bons ou tratveis, mesmo que
o polinmio seja, por exemplo, n. A justificativa
para esse fato, segundo Cormen et al. (2002) e
Papadimitriou e Steiglitz (1998), que, geralmente,
quando um algoritmo polinomial para um problema
descoberto, outros mais eficientes so descobertos
posteriormente.

29 Notao Assinttica 26/02/2013


Classes de comportamento assinttico
Algoritmos polinomiais tiram mais proveito das
novas tecnologias:

30 Notao Assinttica 27/02/2013


Classes de comportamento assinttico
Algoritmos polinomiais so, em sua maioria,
concebidos a partir de um entendimento profundo
da estrutura de um problema, enquanto algoritmos
com a complexidade so, geralmente, variaes da
fora bruta**.
Alguns problemas, como boa parte dos problemas de
otimizao combinatria, no possuem algoritmos
polinomiais.
Algoritmos como o Simplex e Branch-and-Bound
so exponenciais. Mas, geralmente, esse pior caso
exponencial no , na prtica, alcanado com
frequncia***.
31 Notao Assinttica 26/02/2013
Recaptulando:

(g(n)) = { f(n) :
constantes positivas c1, c2 e n0, tais que
n n0, temos 0 c1g(n) f(n) c2g(n) }

O(g(n)) = {f(n) : constantes positivas c e


n0, tais quen n0, temos 0 f(n) cg(n) }

(g(n)) = {f(n) : constantes positivas c e


n0, tais que n n0, temos 0 cg(n) f(n)}

32 Notao Assinttica 26/02/2013


Exerccios:
Calcule a complexidade de tempo dos trechos de cdigo abaixo:

1) int k = 0;
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j++)
k++;
2)
int k = 0;
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j*=2)
k++;

33 Notao Assinttica 26/02/2013


Exerccios:

34 Notao Assinttica 27/02/2013


Exerccios:
1) Mostrar que 3n no O(n).
2) Mostrar que f(n) = n no possui a mesma taxa de crescimento que
g(n) = n.

35 Notao Assinttica 27/02/2013


Referncias:

CORMEN, T. H. et al. Algoritmos: Teoria e


.
Prtica. 2ed. p. 32-47. Rio de. Janeiro: Editora
Campus, 2002.
PAPADIMITRIOU, C. H; STEIGLITZ.
Combinatorial Optimization. Algorithms and
Complexity. p. 162-170. Dover Science, 1998.
ZIVIANI, N. Projeto de Algoritmos Com
Implementaes em Pascal e C, Pioneira Thomson
Learning. p. 318, 1993

36 Notao Assinttica 27/02/2013