Você está na página 1de 31

CCAE

Algoritmos Avanados
Anlise de Complexidade

Centro de Cincias Aplicadas e Educao

UFPB - Campus IV - Litoral Norte

COMPLEXIDADE DE ALGORITMOS

Definio: A Complexidade de um Algoritmo consiste na 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 DE ALGORITMOS
Um algoritmo serve para resolver um determinado problema, e todos os problemas tm sempre uma entrada de dados O tamanho dessa entrada (N) tem geralmente efeito direto no tempo de resposta de um algoritmo Dependendo do problema a ser resolvido, j existem algoritmos prontos ou que podem ser adaptados

O problema : qual algoritmo escolher?

COMO COMPARAR DUAS SOLUES PARA UM MESMO PROBLEMA ?


Tomemos duas solues para localizar um elemento em um vetor: LIN e BIN Temos dois computadores diferentes, A e B, sendo A um Core 2 Duo e B um Celeron.

Tamanho (n) 16 64 256 1024 Tempo de execuo de LIN em A 8 ns 32 ns 128 ns 512 ns Tempo de execuo de BIN em B 100.000 ns 150.000 ns 200.000 ns 250.000 ns
4

Qual a melhor soluo? LIN ou BIN ?

COMO COMPARAR DUAS SOLUES PARA UM MESMO PROBLEMA ?


Tamanho (n)
16 64 256 1024 ... 1.048.576 4.194.304 16.777.216 ... 63,072 x 1012 ... 31,536 x 1012 ns ou 1 ano ... 524.288 ns 2.097.152 ns 8.388.608 ns ... 1.375.000 ns ou cerca de 5 1,4 segundos

Tempo de execuo de LIN em A


8 ns 32 ns 128 ns 512 ns

Tempo de execuo de BIN em B


100.000 ns 150.000 ns 200.000 ns 250.000 ns ... 500.000 ns 550.000 ns 600.000 ns

COMPLEXIDADE DE ALGORITMOS

Pode-se falar de dois tipos de complexidade de algoritmos :


Complexidade Espacial: Quantidade de recursos utilizados para resolver o problema; Complexidade Temporal: Quantidade de tempo utilizado.

Pode ser vista tambm como o nmero de instrues necessrias para resolver um determinado problema;

Em ambos os casos, a complexidade medida de acordo com o tamanho dos dados de entrada (n) Estamos mais interessados em calcular a Complexidade Temporal de um algoritmo!

COMPLEXIDADE DE ALGORITMOS

Existem trs perspectivas para anlise de complexidade:


Melhor Caso Caso Mdio Pior Caso

Nas trs perspectivas, a funo f(n) retorna a complexidade de um algoritmo com entrada de tamanho n

ANLISE DO MELHOR CASO


Definido pela letra grega (mega) Exprime o menor tempo de execuo de um algoritmo para uma entrada de tamanho n pouco usado, por ter aplicao em poucos casos. Ex.:

O algoritmo de pesquisa sequncial em um vetor tem complexidade f(n) = (1) A anlise assume que o nmero procurado seria o primeiro selecionado na lista.

Abordagem otimista!

ANLISE DO CASO MDIO


Definido pela letra grega (Theta) Deve-se obter a mdia dos tempos de execuo de todas as entradas de tamanho n, ou baseado em probabilidade de determinada condio ocorrer Ex.:

O algoritmo de pesquisa sequncial em um vetor tem complexidade f(n) = (n/2) Em mdia ser necessrio visitar n/2 elementos do vetor at encontrar o elemento procurado
Melhor aproximao Muito difcil de determinar na maioria dos casos

ANLISE DO PIOR CASO

Representado pela letra grega O

O maisculo. Trata-se da letra grega micron maiscula

Baseia-se no maior tempo de execuo sobre todas as entradas de tamanho n o mtodo mais fcil de se obter. Ex.:

O algoritmo de pesquisa sequncial em um vetor tem complexidade f(n) = O(n) No pior caso ser necessrio visitar todos os n elementos do vetor at encontrar o elemento procurado

Abordagem pessimista!

A NOTAO O
Tempo (ou espao) contabilizado em nmero de passos do algoritmo (unidade de armazenamento) Anlise do algoritmo determina uma funo que depende do tamanho da entrada n. 10n3 + 4n -10

medida que n aumenta, o termo cbico comea a dominar A constante do termo cbico tem relativamente a mesma importncia que a velocidade da CPU

11

A NOTAO O

Desprezar constantes aditivas ou multiplicativas

Nmero de passos 3n ser aproximado para n


termos de menor grau podem ser desprezados
n2 + n ser aproximado para n2 6n3 + 4n - 9 ser aproximado para n3

Interesse assinttico

12

CLCULO DA COMPLEXIDADE
Foi visto que, para calcular a complexidade de um algoritmo, deve-se analisar o pior caso A anlise deve ser feita de acordo com a tabela a seguir

Nmero de Operaes f(n) c x f(n) f(n) + f(n) f(n) + g(n) f(n) x g(n) Complexidade O(f(n)) O(f(n)) O(f(n)) O(max(f(n),g(n)) O(f(n) x g(n))

CLCULO DA COMPLEXIDADE: ALGORITMO ITERATIVO


void FloidWarshall(int dist[][]) { int i; int j; int k; for ( k = 0; k < n; k++ ) { for ( i = 0; i < n; i++ ) { for ( j = 0; j < n; j++ ) { int a = dist[i][j]; int b = dist[j][k]; int c = dist[k][j]; dist[i][j] = min(a, b + c ); 3 } } 3 } } int min(int a, int b) { if(a < b) return a; return b; }
1+ 1+ 1+ n*( n*( n*( 1+ 1+ 1+ 3 ) ) )

1+1+1+n*(n*(n*(1+1+1+3))) 3+n*n* n*6 3 + 6n O(n )

1+ 1+ 1

CLCULO DA COMPLEXIDADE: ALGORITMO RECURSIVO


A questo se complica um pouco quando se trata de algoritmos recursivos Embora no haja um mtodo nico para esta avaliao, a complexidade de um algoritmo recursivo definida em funo de componentes como:

Complexidade da base Complexidade do ncleo Profundidade da recurso


Nmero de vezes que o procedimento recursivo invocado Depende do tamanho do problema e da taxa de reduo do tamanho do problema justamente em sua determinao que reside o problema!

15

CLCULO DA COMPLEXIDADE: ALGORITMO RECURSIVO


int fatorial( int n ) { if( n == 0 ) { return 1; //Base } else { return n * fatorial( n 1 ); // Ncleo } }

A reduo se d de uma em uma unidade, de n at chegar a 0

Logo, a profundidade da recurso n

Tanto o ncleo quando a base executam apenas uma operao

A base executada uma nica vez e o ncleo n - 1 vezes


16

Logo, o nmero de operaes executadas ((n 1) * 1) + 1, resultando em uma complexidade O(n)

ORDENS DE ALGORITMOS
Complexidade Constante Complexidade Linear Complexidade Logartmica Complexidade Log Linear Complexidade Quadrtica Complexidade Cbica Complexidade Exponencial Complexidade Fatorial

COMPLEXIDADE CONSTANTE - O(1)


So os algoritmos onde a complexidade independe do tamanho n de entradas o nico em que as instrues dos algoritmos so executadas um nmero fixo de vezes

if (condio == true) then { realiza alguma operao em tempo constante } else {

realiza alguma operao em tempo constante


}

COMPLEXIDADE LINEAR O(N)

Uma operao realizada em cada elemento de entrada, ex.: pesquisa de elementos em uma lista

for (i = 0; i < N; i = i + 1 ) { if (condio == true) then { realiza alguma } else { realiza alguma operao em tempo constante em tempo constante

}
}

COMPLEXIDADE LOGARTMICA O(LOGN)

Ocorre tipicamente em algoritmos que dividem o problema em problemas menores


int PesquisaBinaria ( int array[], int chave , int N){ int inf = 0; int sup = N - 1; int meio; while (inf <= sup) { meio = (inf+sup)/2; if (chave == array[meio]) return meio; else if (chave < array[meio]) sup = meio-1; else inf = meio+1; } return -1; // no encontrado }

COMPLEXIDADE LOG LINEAR O(NLOGN)

Ocorre tipicamente em algoritmos que dividem o problema em problemas menores, porm juntando posteriormente a soluo dos problemas menores

void merge(int inicio, int fim) { if (inicio < fim) { int meio = (inicio + fim) / 2; merge(inicio, meio); merge(meio + 1, fim); mesclar(inicio, meio, fim); } }

COMPLEXIDADE QUADRTICA O(N)

Itens so processados aos pares, geralmente com um loop dentro do outro

void bubbleSort(int[] a) { for (int i = 0; i < a.length-1; i++) { for (int j = 0; j < a.length-1; j++) { if (a[j] > a[j+1]) { swap(a, j, j+1); } } } }

COMPLEXIDADE CBICA O(N)

Itens so processados trs a trs, geralmente com um loop dentro do outros dois

int dist[N][N]; int i, j, k; for ( k = 0; k < N; k++ ) for ( i = 0; i < N; i++ ) for ( j = 0; j < N; j++ ) dist[i][j] = min( dist[i][j], dist[i][k] + dist[k][j] );

COMPLEXIDADE EXPONENCIAL O(2N)


Utilizao de Fora Bruta para encontrar a soluo de um problema. A soluo geralmente baseada diretamente no enunciado do problema e nas definies dos conceitos envolvidos Ex.:

Utilizando apenas nmeros possvel criar 10n senhas de n dgitos Um algoritmo de fora bruta para quebrar uma dessas senhas tem complexidade O(2n)

COMPLEXIDADE FATORIAL O(N!)


Tambm baseada na utilizao de fora bruta para encontrar a soluo de um problema Consiste em testar todas as possveis permutaes existentes na soluo procura da soluo tima para o problema Ex.: Problema do Caixeiro Viajante

Encontrar a rota mnima para visitar vrias cidades sem repetir nenhuma um problema base para o projeto de microchips, sequnciamento de genma e muitas outras aplicaes No possui soluo exata eficiente (Problema NP) Utilizao de heursticas para aproximar a soluo tima

25

ORDENS DE COMPLEXIDADE
Imagine um computador que leva 1ms para executar uma operao. A tabela abaixo indica o tempo aproximado de execuo de um algoritmo com diferentes ordens de complexidades para 3 tamanhos de entrada

n 16 32 512 O(n) Log(n) nLog(n) O(n2) O(n3) O(2n) O(n!) 1023 sec ...
26

0.016s
0.032s 0.512s

0.004s
0.005s 0.009s

0.064s
0.16s 4.608s

0.256s
1s 4m22s

4s
33s 37h

1m5s 663 anos 49 dias 10143 sec

LIMITES SUPERIOR E INFERIOR

Todas as ordens de complexidade vistas definem o Limite Superior (Upper Bound) dos Algoritmos

Qualquer que seja o tamanho da entrada, o tempo de execuo crescer com velocidade igual ou inferior a apontada pela anlise de complexidade. Algumas otimizaes podem ser feitas para melhorar o limite superior;

Existem, porm, os Limites Inferiores (Lower Bound) para certos problemas, que so pontos a partir dos quais no mais possvel otimizar uma soluo algortmica

LIMITES SUPERIOR E INFERIOR


Dado um problema de Multiplicao de 2 matrizes N X N. A soluo trivial tem complexidade O(n3);

Sabemos assim que a complexidade deste problema no deve superar O(n3), uma vez que existe um algoritmo com est ordem complexidade que o resolve;

Este limite superior de um algoritmo pode mudar se algum descobrir um algoritmo melhor.

LIMITES SUPERIOR E INFERIOR

Strassen resolveu o problema com uma complexidade de O(nlog 7)


Outros pesquisadores melhoraram ainda mais este resultado. Atualmente o melhor resultado o de Coppersmith e Winograd de O(n2.376).

O limite superior de um algoritmo parecido com o recorde mundial de uma modalidade de atletismo. Ele estabelecida pelo melhor atleta (algoritmo) do momento. Assim como o recorde mundial, o limite superior pode ser melhorado por um algoritmo (atleta) mais veloz.

29

LIMITES SUPERIOR E INFERIOR


s vezes necessrio mostrar que, para um dado problema, qualquer que seja o algoritmo a ser usado, requer um certo nmero mnimo de operaes: o Limite Inferior Para o problema de multiplicao de matrizes de ordem n, apenas para ler os elementos das duas matrizes de entrada leva O(n2). Assim uma cota inferior trivial (n2).

LIMITES SUPERIOR E INFERIOR

Na analogia anterior, o limite inferior no dependeria mais do atleta.


Seria algum tempo mnimo que a modalidade exige, qualquer que seja o atleta. Um limite inferior trivial para os 100 metros seria o tempo que a velocidade da luz leva para percorrer 100 metros no vcuo.

Se um algoritmo tem uma complexidade que igual ao limite inferior do problema ento o algoritmo timo. O algoritmo de CopperSmith e Winograd de O(n2.376) mas o limite inferior de (n).

31

Portanto no timo. Este limite superior ainda pode ser melhorado