Professional Documents
Culture Documents
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
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
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
Nas trs perspectivas, a funo f(n) retorna a complexidade de um algoritmo com entrada de tamanho n
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!
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
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
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))
1+ 1+ 1
15
ORDENS DE ALGORITMOS
Complexidade Constante Complexidade Linear Complexidade Logartmica Complexidade Log Linear Complexidade Quadrtica Complexidade Cbica Complexidade Exponencial Complexidade Fatorial
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
}
}
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); } }
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); } } } }
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] );
Utilizando apenas nmeros possvel criar 10n senhas de n dgitos Um algoritmo de fora bruta para quebrar uma dessas senhas tem complexidade O(2n)
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
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
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.
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
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