Você está na página 1de 40

NOES DE COMPLEXIDADE DE ALGORITMOS

Prof. Carlos F. S. Costa Departamento de Informtica

MOTIVAO

Quais os dois recursos de hardware mais importantes para a execuo de um algoritmo?


Tempo de processamento; Quantidade de memria consumida;

Devemos, ento, observar quanto de cada recurso nossos algoritmos consomem;

Temos que medir quanto de cada recurso nossos programas utilizam!


2

MOTIVAO

Um exemplo bem simples o caso de dois programas que precisam fazer a ordenao de um grande conjunto de dados:
Cada qual deles pode usar uma abordagem bem diferente do outro; Desta forma, cada qual pode resolver o problema com mais ou menos tempo, ocupando mais ou menos memria; Busca-se sempre compreender e trabalhar com a melhor soluo possvel!

MOTIVAO

Basta um computador mais rpido para resolver o problema;

Pena que at mesmo um grande cluster com dezenas de computadores no conseguem resolver eficientemente alguns problemas somente por fora bruta;

Ningum efetua clculo de complexidade ou busca de soluo mais eficiente em um sistema!

, se voc considerar somente os sistemas do tipo controle de locadora, pois sistemas de tempo real, simulaes fsicas, sistemas para clculos estatsticos e estimativas 4 razoavelmente pesadas e tantos outros precisam!

MOTIVAO
Importncia: Um algoritmo no existe, ou seja, no possvel escrev-lo, se antes no for definido o modelo computacional associado (como ser executado).

Conceito bsico no projeto de qualquer algoritmo.

Questo decorrente: Dado um problema qualquer, existe sempre um algoritmo que pode ser projetado para um dado modelo computacional?

No! Em vrios casos possvel mostrar que no existe um algoritmo para resolver um determinado problema considerando um modelo computacional.

MOTIVAO
Que modelos existem? Literalmente dezenas deles. Se no estiver satisfeito, invente o seu!

O mais popular (usado) de todos:

RAM Random Access Machine. Modela o computador tradicional e outros elementos computacionais.

MOTIVAO
MODELO COMPUTACIONAL RAM Elementos do modelo:
um nico processador; Memria infinita.

Observaes: Podemos ignorar os dispositivos de entrada e sada (teclado, monitor, etc) assumindo que a codificao do algoritmo e os dados j esto armazenados na memria. Em geral, no relevante para a modelagem do problema saber como o algoritmo e os dados foram 7 armazenados na memria.

MOTIVAO
COMPUTAO NO MODELO RAM Processador busca instruo/dado da memria. Uma nica instruo executada de cada vez. Cada instruo executada seqencialmente.

Cada operao executada pelo processador, incluindo clculos aritmticos, lgicos e acesso a memria, implica num custo de tempo:

Funo de complexidade de tempo.

Cada operao e dado armazenado na memria, implica num custo de espao:

Funo de complexidade de espao.

MOTIVAO

A complexidade de tempo no representa tempo diretamente, mas o nmero de vezes que determinada operao considerada relevante executada. A complexidade de espao representa a quantidade de memria (numa unidade qualquer) que necessrio para armazenar as estruturas de dados associadas ao algoritmo. Usa-se a notao assinttica para representar essas complexidades:

O (O grande); (mega grande); (Theta); o (o pequeno); (mega pequeno).


9

MOTIVAO
Impacto de algoritmos eficientes A diferena entre algoritmos pode ser muito mais dramtica do que a diferena entre computadores:
Algoritmo A: TA(n) = 2n2 Algoritmo B: TB(n) = 50nlgn

10

Supercomputador: 108 instrues/s Computador pessoal: 106 instrues/s

MOTIVAO
Impacto de algoritmos eficientes
11

COMO MEDIR A EFICINCIA DE UM ALGORITMO?

Avaliao emprica (medir o tempo de execuo); Contagem do nmero de operaes efetuadas; Determinao da complexidade assinttica de um algoritmo;

12

AVALIAO EMPRICA

Experimento 1: Verificar o tempo que dois programas levam para efetuar uma busca em um array e recuperar um dado;

Primeiro programa: 750 ns; Segundo programa: 600 ns;

Qual programa mais eficiente?

E se o primeiro foi executado em um core duo de 2,4 GHz cada, e o segundo em um 486 DX2? E se ambos foram executados na mesma mquina, mas o segundo executou em paralelo com algum outro programa? Somente por avaliao emprica, conseguimos ter certeza de qual o programa mais eficiente?
13

CONSIDERAES SOBRE A AVALIAO EMPRICA

Em meu supercomputador o programa rodou normal...

... Mas nos computadores do cliente no!

Programas podem possuir casos especiais para alguns tipos de casos

Deve-se ento aumentar o nmero de casos de testes tentando cobrir o maior nmero possvel de situaes;

Em uma dada linguagem, um programa pode ser mais eficiente do que quando implementado em outra linguagem;

No estamos analisando o algoritmo em si, mas somente o programa!

14

CONTAGEM DO NMERO DE OPERAES EFETUADAS

Experimento 2: Dado o algoritmo abaixo, vamos contar quantas operaes so necessrias para calcular fatorial(5): function fatorial (n: integer): longint; var f, i: integer; begin if (n < 0) then f := -1 else begin f := 1; for i := 1 to n do f := f*i; end; fatorial := f; end;
15

CONTAGEM DO NMERO DE OPERAES EFETUADAS

No algoritmo anterior:
fatorial(1) 5 operaes; fatorial(5) 13 operaes; fatorial(10) 23 operaes; fatorial(n) 2*n + 3;

Perceba que para calcular o fatorial de um nmero N qualquer, vamos executar 2*N operaes, ou seja, um nmero de operaes diretamente proporcional;
16

CONSIDERAES DO NMERO DE OPERAES EFETUADAS

Em Computao, geralmente no nos preocupamos com a eficincia do algoritmo quando tratando poucos elementos
Se so poucos, por pior que nosso algoritmo seja, provavelmente ele executar rpido e sem ocupar muito espao! 2*n + 3 operaes parecem piores que n2 operaes para n = 0, 1 ou 2;

Entretanto, quanto maior o nmero de elementos ou o valor do dado de entrada...


Para n = 1.000, 2*n + 3 2003; Mas e se nosso algoritmo executasse n2 operaes? 1.000.000!

17

ANLISE DE UM ALGORITMO PARTICULAR

Qual o custo de usar um dado algoritmo para resolver um problema especfico?

Caractersticas que devem ser investigadas:


anlise do nmero de vezes que cada parte do algoritmo deve ser executada, estudo da quantidade de memria necessria.

Qual o algoritmo de menor custo possvel para resolver um problema particular?


Toda uma famlia de algoritmos investigada. Procura-se identificar um que seja o melhor possvel. Colocam-se limites para a complexidade computacional dos algoritmos pertencentes classe.

18

CUSTO DE UM ALGORITMO

Determinando o menor custo possvel para resolver problemas de uma dada classe, temos a medida da dificuldade inerente para resolver o problema. Quando o custo de um algoritmo igual ao menor custo possvel, o algoritmo timo para a medida de custo considerada. Podem existir vrios algoritmos para resolver o mesmo problema. Se a mesma medida de custo aplicada a diferentes algoritmos, ento possvel compar-los e escolher o mais adequado.

19

COMPLEXIDADE ASSINTTICA DE UM ALGORITMO


Como expressar a eficincia de um algoritmo? Atravs da ordem de crescimento do tempo de execuo
apenas o termo de mais alta ordem considerado caracterizao simples da eficincia de um algoritmo permite comparar o desempenho relativo entre algoritmos alternativos

Quando observamos tamanhos de entradas grandes o suficiente, de forma que apenas a ordem de crescimento do tempo de execuo seja relevante, estamos estudando a eficincia assinttica
20

DETERMINAO DA COMPLEXIDADE ASSINTTICA DE UM ALGORITMO

Definio de Complexidade

Quantidade de "trabalho" necessria para a execuo de um algoritmo, expressa em funo das operaes fundamentais, as quais variam de acordo com o algoritmo, e em funo do volume de dados;

Complexidade Assinttica

Trata-se de uma funo que expressa a relao entre o volume de dados ( n ) e o tempo ( t ) necessrio para o processamento dos mesmos; No algoritmo do experimento 2, poderamos dizer que:
f(n) = 2*n + 3
21

FUNO DE COMPLEXIDADE

Para medir o custo de execuo de um algoritmo comum definir uma funo de custo ou funo de complexidade f. f(n) a medida do tempo necessrio para executar um algoritmo para um problema de tamanho n. Funo de complexidade de tempo: f(n) mede o tempo necessrio para executar um algoritmo para um problema de tamanho n. Funo de complexidade de espao: f(n) mede a memria necessria para executar um algoritmo para um problema de tamanho n. Utilizaremos f para denotar uma funo de complexidade de tempo daqui para a frente. Na realidade, a complexidade de tempo no representa tempo diretamente, mas o nmero de vezes que determinada operao considerada relevante executada. 22

DETERMINAO DA COMPLEXIDADE ASSINTTICA DE UM ALGORITMO


Dominao Assinttica

A anlise de um algoritmo geralmente conta com apenas algumas operaes elementares. A medida de custo ou medida de complexidade relata o crescimento assinttico da operao considerada.

Notaes: O ( Grande), (Omega) e (Theta);

A ltima notao leia tta;

Obs: Funes assintoticamente no-negativas;


23

NOTAO

Para uma dada funo g(n), denotamos por (g(n)) o conjunto de funes f(n) = (g(n)), se existem constantes positivas c1, c2 e n0 tais que 0 c1g(n) f(n) c2g(n), para todo n n0.

A notao descreve um limite assinttico restrito (firme) para f(n). Exemplo: 3x3+ 5 = ( x3 )

24

NOTAO O

Para uma dada funo g(n), denotamos por O(g(n)) o conjunto de funes f(n)=O(g(n)), existem constantes positivas c e n0 tais que 0 f(n) cg(n), para todo n >= n0 A notao O descreve um limite assinttico superior. Expressa que g(n) domina assintoticamente f(n).

Exemplos: 3x2 + 5 = O(x2) x3/2 = O(x3) 720 = O(1)

25

NOTAO O

Quando afirmamos que o tempo de execuo de um algoritmo O(g(n)), queremos dizer que, independente da entrada especfica de tamanho n escolhida para cada valor de n, o tempo de execuo no mximo uma constante vezes g(n), para um valor de n suficientemente grande.

26

NOTAO

Para uma dada funo g(n), denotamos por (g(n)) o conjunto de funes

f (n) = (g(n)), se existem constantes positivas c e n0 tais que 0 cg(n) f(n) para todo n >= n0 A notao descreve um limite assinttico inferior.
Exemplos: 3x3 + 5 = ( x2 ) x3/2 = ( x3/3)

27

NOTAO

Quando afirmamos que o tempo de execuo de um algoritmo (g(n)), queremos dizer que, independente da entrada especfica de tamanho n escolhida para cada valor de n, o tempo de execuo pelo menos uma constante vezes g(n), para um valor de n suficientemente grande.

28

GRAFICAMENTE

29

PRINCIPAIS CLASSES DE COMPORTAMENTO ASSINTTICO

O (1) : O uso do algoritmo independe do tamanho de n. Neste caso as instrues do algoritmo so executadas um nmero fixo de vezes; O (log n): ocorre tipicamente em algoritmos que resolvem um problema transformando-o em problemas menores; O (n): linear Um conjunto de operaes de tamanho constante aplicado a cada elemento da entrada; O (n log n): Ocorre em algoritmos que resolvem um problema quebrando-o em problemas menores, resolvendo cada um deles independentemente e depois juntando as solues;

30

PRINCIPAIS CLASSES DE COMPORTAMENTO ASSINTTICO

O (n2): quadrtico. Algoritmos desta ordem de complexidade ocorrem quando os itens de dados so processados aos pares, muitas vezes em um loop dentro de outro. teis para resolver problemas de tamanhos relativamente pequenos; O (n3): cbica teis para resolver problemas de tamanhos relativamente pequenos; O (nk): polinomial OK para k pequeno; O (kn), O (n!), O (nn): exponencial Geralmente no so teis sob o ponto de vista prtico. Eles ocorrem na soluo de problemas quando se usa fora bruta para resolv-los. 31

TABELA COMPARATIVA DAS PRINCIPAIS CLASSES

CLASSE NOTAO O constante O(1) logaritmico O(lg n) linear O(n) O(n lg n) O(n lg n) quadrtico O(n) cbico O(n) exponencial O(2^n)

n=10 1 3,32 10 33,2 100 1000 1024

n=100 1 6,64 100 664 10000 1000000 10^30

n=1000 1 9,97 1000 9970 1000000 10^9 10^301

... n=1000000 1 19,93 1000000 199,3*10^5 10^12 10^18 10^301030

32

ANLISE DO COMPORTAMENTO ASSINTTICO

Exemplo1: Determine para o seguinte fragmento de cdigo no caso mdio. Assumir que todas as variveis so do tipo inteiro.
(1) (n2) (1) (1)*+(n2)* (1) = (n2)

Sum:=0; For i:=0 to (n*n) do sum:=sum+1;

33

PROPRIEDADES DE COMPARAES ASSINTTICAS

Transitividade f (n) = (g(n)) e g(n) = (h(n)) implicam f (n) = (h(n)) vale para as outras notaes Reflexividade f (n) = (f (n)) f (n) = O(f (n)) f (n) = (f (n)) Simetria f (n) = (g(n)) se e somente se g(n) = (f (n))

Analogia com comparao de nmeros reais f (n) = O(g(n)) semelhante a a <= b f (n) = (g(n)) semelhante a a >= b f (n) = (g(n)) semelhante a a = b

34

OS TRS CASOS

Para qualquer algoritmo, sempre h situaes em que ele resolver de forma muito rpida e outras em que nem tanto;

Exemplo: ordenao dos dados de um vetor


Se ele j estiver ordenado? timo! E se os dados estiverem em ordem inversa? Dependendo do algoritmo, pode ser muito ruim;

Desta forma, para determinar a eficincia de um algoritmo, precisamos conhecer a sua complexidade para o melhor caso, o pior caso e o caso mdio.
35

MELHOR CASO

Caso para o qual o algoritmo executa da melhor forma possvel:


Menor nmero de instrues; Menor tempo de processamento necessrio; Menor consumo de memria.

36

PIOR CASO

Ao contrrio do melhor caso, este o caso para o qual o algoritmo executa da pior forma possvel;

37

CASO MDIO

A complexidade para o caso mdio dada por meio de clculo tempo mdio esperado para a resoluo de um problema qualquer, independente de como os dados esto (se ordenados ou no, etc);

38

CALCULANDO A COMPLEXIDADE PARA CADA CASO

Geralmente, necessrio conhecer qual o volume de dados que atende a cada um dos casos e, ento, busca-se definir a funo matemtica que expressa o nmero de operaes necessrias para cada caso; No caso de algoritmos recursivos, deve-se determinar primeiro a frmula de recorrncia capaz de express-los e, ento, resolv-la.
39

REFERNCIAS BIBLIOGRFICAS

MADEIRA, Gonalo, Complexidade Computacional, disponvel em http://w3.ualg.pt/~hshah/algoritmos/aula8/Aula8.ht m


SILVA, Elton, Anlise Assinttica da Complexidade de Algoritmos, disponvel em http://www.decom.ufop.br/prof/elton/cic210/cap2.pd f
40

Você também pode gostar