Anda di halaman 1dari 31

CCAE

Centro de
Cincias
Aplicadas
e Educao

UFPB - Campus IV - Litoral Norte

Algoritmos Avanados
Anlise de Complexidade

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)

Tempo de execuo de
LIN em A

Tempo de execuo de
BIN em B

16

8 ns

100.000 ns

64

32 ns

150.000 ns

256

128 ns

200.000 ns

1024

512 ns

250.000 ns

Qual a melhor soluo? LIN ou BIN ?

COMO COMPARAR DUAS SOLUES


PARA UM MESMO PROBLEMA ?
Tamanho (n)

Tempo de execuo de
LIN em A

Tempo de execuo de
BIN em B

16

8 ns

100.000 ns

64

32 ns

150.000 ns

256

128 ns

200.000 ns

1024

512 ns

250.000 ns

...

...

...

1.048.576

524.288 ns

500.000 ns

4.194.304

2.097.152 ns

550.000 ns

16.777.216

8.388.608 ns

600.000 ns

...
63,072 x 1012

...
31,536 x 1012 ns ou 1 ano

...
1.375.000 ns ou cerca de
1,4 segundos5

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.

Em

Pode ser vista tambm como o nmero de instrues


necessrias para resolver um determinado problema;

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

Nmero de passos 3n ser aproximado para n

Interesse

constantes aditivas ou multiplicativas

assinttico

termos de menor grau podem ser desprezados


n2 + n ser aproximado para n2
6n3 + 4n - 9 ser aproximado para n3

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

Complexidade

f(n)

O(f(n))

c x f(n)

O(f(n))

f(n) + f(n)

O(f(n))

f(n) + g(n)

O(max(f(n),g(n))

f(n) x 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
}
}

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

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

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
} else {
return
}
}

) {
{
1; //Base
n * fatorial( n 1 );

// Ncleo

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

Logo,

o nmero de operaes executadas ((n 1) *


1) + 1, resultando em uma complexidade O(n)

16

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

em tempo constante

}
else

{
realiza alguma operao 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

O(n)

Log(n)

nLog(n)

O(n2)

O(n3)

O(2n)

16

0.016s

0.004s

0.064s

0.256s

4s

32

0.032s

0.005s

0.16s

1s

33s

512

0.512s

0.009s

4.608s

4m22s

37h

O(n!)

1m5s 663 anos


49 dias
10143 sec

1023 sec
...
26

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).

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).

Portanto no timo. Este limite superior ainda pode


ser melhorado

31

Anda mungkin juga menyukai