Você está na página 1de 23

Analise de Algoritmos e Notao Assinttica

Algoritmo

Algoritmo uma sequencia ordenada e finita de operaes


bem definidas e eficazes que, quando executadas por um computador, sempre termina num determinado perodo de tempo, produzindo uma soluo ou indicando que a soluo no pode ser obtida.

(Procedimento passo a passo para obteno de um fim)

Modo de Especificao:

Linguagem natural Pseudo cdigo Linguagem de Programao

Anlise de Algoritmos

Anlise de Algoritmo

tempo de processamento em funo dos dados de entrada; espao de memria total requerido para os dados; comprimento total do cdigo; correcta obteno do resultado pretendido; robustez (como comporta-se com as entradas invlidas ou no previstas).

Anlise de Algoritmos medio de complexidade de algoritmo

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

Complexidade

Porqu o estudo da Complexidade?

Performance

Escolher entre vrios algoritmos o mais eficiente para implementar; Desenvolver novos algoritmos para problemas que j tm soluo; Desenvolver algoritmos mais eficientes (melhorar os algoritmos), devido ao aumento constante do "tamanho" dos problemas a serem resolvidos.

Complexidade Computacional - torna possvel determinar se a implementao de determinado algoritmo vivel.

Complexidade

Tipos de Complexidade

Espacial

Este tipo de complexidade representa, por exemplo, o espao de memria usado para executar o algoritmo. Este tipo de complexidade o mais usado podendo dividir-se em dois grupos:

Temporal

Tempo (real) necessrio execuo do algoritmo. (como podemos medir?) Nmero de instrues necessrias execuo.

Analise de Algoritmos

Medidas de Anlise

Devem ser independentes da tecnologia (hardware/software) Modelos Matemticos simplificados baseados nos factores relevantes:

Tempo de Execuo
Uma funo que relaciona o tempo de execuo com o tamanho de entrada:

t = F(n)

Conjunto de operaes a serem executadas. Custo associado execuo de cada operao.

Ocupao de Espao em Memria

Complexidade

Exemplo

Sejam 5 algoritmos A1 a A5 para resolver um mesmo problema, de complexidades diferentes. (Supomos que uma operao leva 1 ms para ser efectuada.) Tk(n) a complexidade ou seja o nmero de operaes que o algoritmo efectua para n entradas

n
16 32 512

T1(n)= n

A1

T2(n)=nlog n

A2

T3

A3

(n)=n2

T4

A4

(n)=n3

T5(n)=2n

A5

0.016s 0.032s 0.512s

0.064s 0.16s 9s

0.256s 1s 4m22s

4s 33s 1 Dia 13h

1m4s 46 Dias 10137 Sculos

tempo necessrio para o algoritmo em funo de n entradas

Operaes primitivas

Atribuio de valores a variveis Chamadas de mtodos Operaes aritmticas Comparao de dois nmeros Acesso a elemento de um array Seguir uma referncia de objecto (acesso a objecto) Retorno de um mtodo

Algoritmo do exemplo em pseudocdigo


arrayMax(A, n):
Entrada: array A com n>=1 elementos inteiros Saida: o maior elemento em A

tmpMax <- A[0] for i<-1 to n-1 do if tmpMax < A[i] then tmpMax <- A[i] return tmpMax

Algoritmo em operaes primitivas

tmpMax <- A[0] for i <- 1 to n-1 do

2 1+n (comparao i<n)


Corpo do ciclo

if tmpMax < A[i] then tmpMax <- A[i] return tmpMax

4(n-1) ou 6 (n-1), se trocar max 1

Total1= 2+1+n+4(n-1)+1= 5n (melhor caso) Total2= 2+1+n+6(n-1)+1= 7n -2 (pior caso)


10

Simplificamos a anlise

Este nvel de detalhe necessrio? Na analise de algoritmos importante concentrar-se na taxa de crescimento do tempo de execuo como uma funo do tamanho de entrada n, obtendo-se um quadro geral do comportamento.
Assim para o exemplo basta saber que o tempo de execuo de algoritmo cresce proporcionalmente a n.
(O tempo real seria n*factor constante, que depende de SW e HW).

11

Notao Assinttica

Notao O (big O)

Definio: Considere uma funo f(n) no negativa para todos os inteiros n0. Dizemos que f(n) O(g(n)) e escrevemos f(n) = O(g(n)), se existem um inteiro n0 e uma constante c>0, tais que para todo o inteiro nn0, f(n) cg(n)

Caracteriza o comportamento assinttico de uma funo, estabelecendo um limite superior quanto taxa de crescimento da funo em relao ao crescimento de n. Permite ignorar factores constantes e termos de menor ordem, centrando-se nos componentes que mais afectam o crescimento de uma funo.
12

Diagrama

Definio do Grande O
13

Notao Assinttica
Terminologia de classes mais comuns de funes:

Logartmica - O(log n) Linear - O(n) Quadrtica - O(n2) Polinomial O(nk), com k1 Exponencial O(an), com a>1

14

Ordens mais comuns


2n (exponencial) n2 (quadrtica)

n log n f n (linear) log n (logartmica) 1 (constante) n

Fonte: Sahni, "Data Structures, Algorithms and Applications in C++"

15

Teoremas
1.

Comportamento assinttico da soma de duas funes cujos comportamentos assintticos particulares so conhecidos: Se f1(n) = O(g1(n)) e f2(n) = O(g2(n)), ento: f1(n) + f2(n) = O(max(g1(n)) , g2(n)))

2. 3.

O(k f(n)) = O(f(n)) O(f(n)) O(g(n)) = O(f(n) g(n))

16

Eficincia de um Algoritmo, mais um exemplo

Trs algoritmo para calcular 1 + 2 + n para um n > 0


17

Eficincia de um Algoritmo

O(n)

O(n2)

O(1)

Nmero de operaes necessrias


18

Eficincia de um Algoritmo

O nmero de operaes em funo de n


19

Eficcia

O(n)

20

Eficcia

O(n2)

21

Eficcia

Outro algoritmo de O(n2)

22

Implementao dos TADs

Implementao esttica

Escolha da representao

Array normal Array circular

Implementao dinmica

Escolha da representao

Referencia para o fim Nmero de elementos

23