Sei sulla pagina 1di 28

Analise de Algoritmos e Notao Assinttica

Alex Fernandes da Veiga Machado alexcataguases@hotmail.com

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)

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 (convervncia); 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 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


6

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 efetuada.) 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 objeto (acesso a objeto) 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.
tempo real seria n*factor constante, que depende de SW e HW). (O

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 fatores constantes e termos de menor ordem, centrando-se nos componentes que mais afetam 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)))

1.
2.

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

Complexidade de Algoritmos
Existem trs escalas de complexidade:
Melhor Caso Caso Mdio Pior Caso

Nas trs escalas, a funo f(N) retorna a complexidade de um algoritmo com entrada de N elementos

Complexidade de Algoritmos Melhor Caso


Definido pela letra grega (mega) o menor tempo de execuo em uma entrada de tamanho N pouco usado, por ter aplicao em poucos casos. Ex.:
Se tivermos uma lista de N nmeros e quisermos encontrar algum deles assume-se que a complexidade no melhor caso f(N) = (1), pois assume-se que o nmero estaria logo na cabea da lista.

Complexidade de Algoritmos Caso Mdio

Complexidade de Algoritmos Pior Caso


Ser o caso utilizado durante esse curso Representado pela letra grega O (O maisculo. Trata-se da letra grega micron maiscula) o mtodo mais fcil de se obter. Baseia-se no maior tempo de execuo sobre todas as entradas de tamanho N Ex.:
Se tivermos uma lista de N nmeros e quisermos encontrar algum deles, assume-se que a complexidade no pior caso O (N), pois assume-se que o nmero estaria, no pior caso, no final da lista. Outros casos adiante

Complexidade de Algoritmos
Mas como saber qual a complexidade de um determinado algoritmo implementado? Para resolver esse problema, dividiu-se os algoritmos em Classes de Problemas, de acordo com o parmetro que afeta o algoritmo de forma mais significativa

Alguns Exemplos - Recursividade


No caso da recursividade, depende da quantidade de iteraes que se pode chegar Ex.: se eu quiser saber os N primeiros termos de um fatorial, a complexidade N Function Fatorial (N: Integer): Integer; Begin If n=0 then Fatorial := 1 Else Fatorial := N + Fatorial (N-1) End;

Potrebbero piacerti anche