Você está na página 1de 23

11/03/11

FACULDADE ANHANGUERA DE TAUBAT - Unidade 2

Cincia da Computao
Anlise e Complexidade de Algoritmos Prof. Esp. Fernando Salles Claro
fernando.claro@unianhanguera.edu.br
Aula 02 Medidas de complexidade, anlise assint8ca de limites de complexidades.

Agenda
Onde estamos? Sobre a aula anterior! O que complexidade? Complexidade de Espao Complexidade de Tempo Critrios de complexidade Anlise: melhor caso, caso mdio, pior caso Anlise assintFca Classes de comportamento assintFco Bibliograa Prxima Aula Passo a palavra

11/03/11

Onde estamos?
Plano Ensino Aprendizagem (PEA)
Semana 1 2 3 4 5 6 7 8 9 Temas Apresentao da disciplina. Introduo a Anlise e Complexidade de Algoritmos Medidas de complexidade Medidas de complexidade Medidas de complexidade Anlise de desempenho de alguns algoritmos clssicos Anlise de desempenho de alguns algoritmos clssicos Anlise de desempenho de alguns algoritmos clssicos Reviso e Exerccios Avaliao do 1 Bimestre

Sobre a aula anterior!


O que um algoritmo O que complexidade O que ecincia de um algoritmo

11/03/11

O que complexidade?
Porque estudar a complexidade do algoritmo? O fato do algoritmo teoricamente resolver o problema no signica que ele seja aceitvel na prFca. Obter informaes para realizar uma comparao entre os algoritmos e escolher o mais eciente.

O que complexidade?
Melhorar se possvel, seu desempenho e escolher entre os algoritmos disponveis, o melhor. Critrios: quanFdade de trabalho requerido, quanFdade de tempo requerido, simplicidade, exaFdo de resposta e oFmalidade.

11/03/11

Complexidade de espao
A memria usada por um programa, depende da sua implementao. Mas todo programa exige uma rea para guardar suas variveis, constantes, instrues e dados. Pode haver grande variao na representao das informaes, requerendo mais ou menos memria. Exemplo: Representar os dados em um matriz (representao natural) e em um grafo (VrFces e arestas).

Complexidade de tempo
Principal foco de estudo da disciplina. ObjeFvo uma anlise matemFca das diculdades da resoluo do problema computacionalmente. Muitas vezes essa anlise, antecipa o clculo da complexidade para a fase do projeto do algoritmo, inuenciando o resultado.

11/03/11

Critrios de complexidade
Como medir? Atravs da escolha de uma operao fundamental. Conta-se ento o n de vezes dessa operao no algoritmo. A operao escolhida como fundamental deve ser aquela que expressa a quanFdade de trabalho do algoritmo, dispensando outras medidas. Pode tambm, ser necessria mais de uma operao fundamental, com pesos diferentes

Critrios de complexidade
Exemplo 1: Encontrar maior valor de um conjunto de nmeros.
int Max (vetor A, int n) { int i, Temp; Temp = A[0]; for (i=1;i<n;i++) { if (Temp < A[i]) Temp = A[i]; } return Temp; }

11/03/11

Critrios de complexidade
Exemplo 2: Busca Seqencial
int Busca(int chave, vetor A, int n) { int i, posicao; i = 0; posicao = -1; while (i<n) && (posicao = -1){ if (A[i] = chave) posicao = i else i++; } return posicao; }

Exerccio
Escreva uma funo C que retorne quantas vezes o nmero 9 se repete no seguinte vetor : V = [0 2 9 5 4 2 7 9 9 9 3 5 1 0 9]. Depois idenFque qual a operao fundamental e sua funo f(n).

11/03/11

Exerccio
Soluo (do professor)
int Conta9(vetor A; int n) { int vezes, i; vezes=0; for(i=0; i<n; i++) { if (A[i] == 9) vezes++; } return vezes; }

Melhor caso, caso mdio, pior caso


Melhor caso: Corresponde ao menor tempo sobre todas as possveis entradas de tamanho n. Pior caso: Corresponde ao maior tempo de execuo sobre todas as entradas de tamanho n. Caso mdio: Corresponde a mdia dos tempos de execuo de todas as entradas de tamanho n. Uma distribuio de probabilidades sobre o conjunto de entradas de tamanho n suposta, e o custo mdio obFdo com base nessa distribuio.

11/03/11

Melhor caso, caso mdio, pior caso


Determine a complexidade de melhor, pior e caso mdio para o seguinte algoritmo de busca sequencial.
int Busca(char chave, vetor A, int n) { int i, posicao; i = 0; posicao = -1; while (i<n) && (posicao = -1) { if (A[i] = chave) posicao = i else i++; } return posicao; }

Melhor caso, caso mdio, pior caso


Soluo: melhor caso: f(n) = 1 pior caso : f(n) = n caso mdio : f(n) = (n + 1) / 2

11/03/11

Melhor caso, caso mdio, pior caso


Para o caso mdio, se considerarmos que pi for a probabilidade de que o i-simo valor seja procurado, e considerando que para recuperar o i-simo registro so necessrias i comparaes, ento f(n) = 1 x p1 + 2 x p2 + 3 x p3 + ... + n x pn

Melhor caso, caso mdio, pior caso


Para calcular f(n) basta conhecer a distribuio de probabilidade pi. Se cada valor Fver a mesma probabilidade de ser acessado que todos os outros, ento pi = 1/n, 1 i n. Neste caso:
! ! !! ! ! !!! ! !! !!! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! !

11/03/11

Melhor caso, caso mdio, pior caso


Determine a complexidade de melhor, pior e caso mdio para o algoritmo que obtm o maior e o menor valor de um vetor de inteiros.
void MaxMin (Vetor int i; *Max = A[0]; *Min = A[0]; for (i=1; i < n; if (A[i] > * *Max = if (A[i] < * *Min = } } A, int n, int *Max, int *Min) {

i++) { Max) A[i]; Min) A[i];

Melhor caso, caso mdio, pior caso


Determine a complexidade de melhor, pior e caso mdio para o algoritmo que obtm o maior e o menor valor de um vetor de inteiros. melhor caso: f(n) = 2(n-1) , para n > 0 pior caso : f(n) = 2(n-1) , para n > 0 caso mdio : f(n) = 2(n-1) , para n > 0

10

11/03/11

Melhor caso, caso mdio, pior caso


Melhore o algoritmo que obtm o maior e o menor valor de um vetor de inteiros.
void MaxMin (Vetor A, int n, int *Max, int *Min) { int i; *Max = A[0]; *Min = A[0]; for (i=1; i < n; i++) { if (A[i] > *Max) *Max = A[i]; else if (A[i] < *Min) *Min = A[i]; } }

Melhor caso, caso mdio, pior caso


Para esta implementao, os casos a considerar so: melhor caso: f(n) = n-1 pior caso : f(n) = 2(n-1) caso mdio : f(n) = 3n/2 3/2

11

11/03/11

Melhor caso, caso mdio, pior caso


O melhor caso ocorre quando os elementos de A esto em ordem crescente. O pior caso ocorre quando os elementos de A esto em ordem decrescente. No caso mdio, A[i] maior do que Max a metade das vezes. Logo:
! ! !!!!! ! ! ! !! ! ! ! ! !"#"!! ! !! ! ! !

Anlise assinttica
O custo para obter uma soluo para um dado problema aumenta com o tamanho n do problema. O n de comparaes para encontrar o maior elemento de um conjunto n de inteiros, ou para ordenar os elementos de um conjunto com n elementos, aumenta com n. O parmetro n fornece uma medida da diculdade para se resolver o problema, no senFdo de que o tempo necessrio para resolver o problema cresce quando n cresce.

12

11/03/11

Anlise assinttica
Para valores sucientemente pequenos de n, qualquer algoritmo custa pouco para ser executado, mesmo os algoritmos inecientes. Logo, anlise de algoritmos realizada para valores grandes de n, isto , estuda-se o comportamento assintFco das funes de custo. O comportamento assintFco de f(n) representa o limite do comportamento do custo quando n cresce.

Classes de comportamento assinttico


Se f uma funo de complexidade para um algoritmo F, ento O(f) considerada a complexidade assint8ca ou comportamento assint8co do algoritmo F. Igualmente, se g uma funo para um algoritmo G, ento O(G) considerada a complexidade assintFca do algoritmo G. A relao de dominao assintFca permite comparar funes de complexidade. Entretanto, se as funes f e g dominam assintFcamente uma a outra, ento os algoritmos so equivalentes.

13

11/03/11

Classes de comportamento assinttico


Nestes casos, o comportamento assintFco no serve para comparar os algoritmos. Por exemplo: dois algoritmos F e G aplicados a mesma classe de problemas, sendo que F leva trs vezes o tempo de G ao serem executados, isto , f(n) = 3g(n), sendo que O(f(n)) = O(g(n)). Logo o comportamento assintFco no serve para comparar os algoritmos F e G, porque eles diferem apenas por uma constante.

Classes de comportamento assinttico


Programas podem ser avaliados por meio da comparao de suas funes de complexidade, negligenciando as constantes de proporcionalidade. Um programa de tempo de execuo O(n) melhor que um programa com tempo de execuo O(n2). Entretanto, as constantes de proporcionalidade em cada caso podem alterar esta considerao.

14

11/03/11

Classes de comportamento assinttico


Exemplo: Um programa leva 100n unidades de tempo para ser executado, enquanto outro leva 2n2 unidades de tempo. Qual dos dois programas melhor ? A resposta depende do tamanho do problema a ser executado! Para problemas de tamanho n<50, o programa com tempo de execuo 2n2 melhor do que o programa com execuo de 100n. Entretanto quando n cresce, o programa com tempo O(n2) leva muito mais tempo que o programa O(n).

Classes de comportamento assinttico


A maioria dos algoritmos possui um parmetro que afeta o tempo de execuo de forma mais signicaFva, usualmente o n de itens a serem processados. O parmetro pode ser o n de registros de um arquivo a ser ordenado, ou o n de ns de um grafo. As principais classes de problemas possuem as seguintes funes de complexidade:

15

11/03/11

Classes de comportamento assinttico


f(n) = O(1) . Algoritmos de complexidade O(1) so ditos de complexidade constante. O uso do algoritmo independe do tamanho de n. Neste caso, as instrues de um algoritmo so executados um n xo de vezes.

Classes de comportamento assinttico


f(n) = O(log n). Um algoritmo de complexidade O(log n) dito ter complexidade logartmica. Este tempo de execuo ocorre Fpicamente em algoritmos que resolvem um problema transformando-o em problemas menores. Nestes casos, o tempo de execuo pode ser considerado menor do que uma constante grande. Quando n mil e a base do logaritmo 2, log2 n 10, quando n 1 milho log2 n 20. A base do logaritmo muda pouco estes valores, quando n 1 milho o log10 n 6.

16

11/03/11

Classes de comportamento assinttico


f(n) = O(n). Um algoritmo de complexidade O(n) dito ter complexidade linear. Em geral, um pequeno trabalho realizado sobre cada elemento de entrada. Esta a melhor situao possvel para um algoritmo que tem de processar n elementos de entrada ou produzir n elementos de sada. Cada vez que n dobra de tamanho, o tempo de execuo dobra.

Classes de comportamento assinttico


f(n) = O(n log n). Este tempo de execuo ocorre Fpicamente em algoritmos que resolvem um problema quebrando-o em problemas menores, resolvendo cada um deles independentemente e depois juntando as solues. Quando n 1 milho e a base do logaritmo 2, n log2 n cerca de 20 milhes. Quando n 2 milhes n log2 n cerca de 42 milhes, pouco mais que o dobro.

17

11/03/11

Classes de comportamento assinttico


f(n) = O(n2). Um algoritmo de complexidade O(n2) dito ter complexidade quadr8ca. Algoritmos desta ordem de complexidade ocorrem quando os itens de dados so processados aos pares, muitas vezes em um lao dentro de outro. Quando n mil, o n de operaes 1 milho. Sempre que n dobra, o tempo de execuo mulFplicado por 4. Este Fpo de algoritmo Fl para resolver problemas de tamanhos relaFvamente pequenos.

Classes de comportamento assinttico


f(n) = O(n3). Um algoritmo de complexidade O(n3) dito ter complexidade cbica. Algoritmos desta ordem de complexidade so teis apenas para resolver pequenos problemas. Quando n 100, o n de operaes da ordem de 1 milho. Sempre que n dobra, o tempo de execuo ca mulFplicado por 8.

18

11/03/11

Classes de comportamento assinttico


f(n) = O(2n). Este algoritmo dito ter complexidade exponencial. Algoritmos desta ordem no so teis sob o ponto de vista prFco. Eles ocorrem na soluo de problemas quando se usa fora bruta para resolv-los. Quando n 20, o tempo de execuo cerca de 1 milho. Quando n dobra, o tempo de execuo ca elevado ao quadrado.

Classes de comportamento assinttico


f(n) = O(n!). Um algoritmo de complexidade O(n!) tambm dito ter complexidade fatorial e tem comportamento pior que a complexidade exponencial O(2n). Algoritmos desta ordem de complexidade tambm ocorrem na soluo de problemas quando se usa fora bruta para resolv- los. Quando n 20, 20! = 2432902008176640000, um nmero com 19 dgitos. Quando n 40, 40! = 815915283247897734345611269596115894272000 000000, um nmero com, 48 dgitos.

19

11/03/11

Classes de comportamento assinttico


Para ilustrar melhor a diferena entre as classes de comportamento assintFco, a tabela a seguir mostra a razo de crescimento de vrias funes de complexidade para tamanhos diferentes de n, em que cada funo expressa o tempo de execuo em microssegundos. Um algoritmo linear executa em 1 segundo, 1 milho de operaes.

Classes de comportamento assinttico


Funo de custo Tamanho n 10 20 30 40 50 60

n n2 n3 n5 2n 3n

0,00001 s 0,0001 s 0,001 s 0,1 s 0,001 s 0,059 s

0,00002 s 0,0004 s 0,008 s 3,2 s 1 s 58 min

0,00003 s 0,0009 s 0,027 s 24,3 s 17,9 min 6,5 anos

0,00004 s 0,0016 s 0,064 s 1,7 min 12,7 dias 3855 sc

0,00005 s 0,0025 s 0,125 s 5,2 min 35,7 anos 108 sc

0,00006 s 0,0036 s 0,216 s 13 min 266 sc 1013 sc

20

11/03/11

Classes de comportamento assinttico


Outro aspecto interessante o efeito causado pelo aumento da velocidade dos computadores sobre os algoritmos com as funes de complexidade citadas anteriormente.
Funo de custo de tempo n n2 n3 2n Computador Atual t1 t2 t3 t4 Computador 100 Computador vezes mais rpido 1000 vezes mais rpido 100 t1 10 t2 4,6 t3 t4 + 6,6 1000 t1 31,6 t2 10 t3 t4 + 10

Classes de comportamento assinttico


Um caixeiro viajante deseja visitar n cidades, de tal forma que sua viagem inicie e termine em uma mesma cidade, e cada cidade deve ser visitada apenas uma nica vez. Supondo que sempre existe uma estrada entre duas cidades quaisquer, o problema encontrar a menor rota que o caixeiro possa uFlizar na sua viagem.
(n-1)! rotas possveis n adies em cada rota n! n total de adies

21

11/03/11

Classes de comportamento assinttico


Para o exemplo abaixo, temos 24 adies (4!). Supondo agora 50 cidades, o nmero de adies seria 50!, que aproximadamente 1064. Considerando um computador capaz de executar 109 adies por segundo, o tempo total para resolver o problema seria de 1045 sculos.
(n-1)! rotas possveis n adies em cada rota n! n total de adies

Bibliografia
ZIVIANI, Nivio. Projeto de Algoritmos. p. 3-19

22

11/03/11

Prxima Aula
Exerccios de reviso das aulas 1 e 2

Passo a palavra ...

23

Você também pode gostar