Escolar Documentos
Profissional Documentos
Cultura Documentos
01 Complex
01 Complex
Complexidade de Algoritmos
Por que analisar a complexidade dos algoritmos? A preocupao com a complexidade de algoritmos fundamental para projetar algoritmos ecientes. Podemos desenvolver um algoritmo e depois analisar a sua complexidade para vericar a sua ecincia. Mas o melhor ainda ter a preocupao de projetar algoritmos ecientes desde a sua concepo.
Complexidade de Algoritmos
Para um dado problema considere dois algoritmos que o resolvem. Seja n um parmetro que caracteriza o tamanho da entrada do algoritmo. Por exemplo, ordenar n nmeros ou multiplcar duas matrizes quadradas n n (cada uma com n2 elementos). Como podemos comparar os dois algoritmos para escolher o melhor?
Complexidade de Algoritmos
Precisamos denir alguma medida que expresse a ecincia. Costuma-se medir um algoritmo em termos de tempo de execuo ou o espao (ou memria) usado.
Para o tempo, podemos considerar o tempo absoluto (em minutos, segundos, etc.). Medir o tempo absoluto no interessante por depender da mquina. Em Anlise de Algoritmos conta-se o nmero de operaes consideradas relevantes realizadas pelo algoritmo e expressa-se esse nmero como uma funo de n. Essas operaes podem ser comparaes, operaes aritmticas, movimento de dados, etc.
Complexidade de Algoritmos
Complexidade de Algoritmos
Complexidade de tempo
Como exemplo, considere o nmero de operaes de cada um dos dois algoritmos que resolvem o mesmo problema, como funo de n. Algoritmo 1: f1 (n) = 2n2 + 5n operaes Algoritmo 2: f2 (n) = 500n + 4000 operaes Dependendo do valor de n, o Algoritmo 1 pode requerer mais ou menos operaes que o Algoritmo 2. (Compare as duas funes para n = 10 e n = 100.)
Complexidade de Algoritmos
Comportamento assinttico
Algoritmo 1: f1 (n) = 2n2 + 5n operaes Algoritmo 2: f2 (n) = 500n + 4000 operaes Um caso de particular interesse quando n tem valor muito grande (n ), denominado comportamento assinttico. Os termos inferiores e as constantes multiplicativas contribuem pouco na comparao e podem ser descartados. O importante observar que f1 (n) cresce com n2 ao passo que f2 (n) cresce com n. Um crescimento quadrtico considerado pior que um crescimento linear. Assim, vamos preferir o Algoritmo 2 ao Algoritmo 1.
Complexidade de Algoritmos
Notao O
Dada uma funo g (n), denotamos por O (g (n)) o conjunto das funes
{ f (n) : constantes c e n0 tais que 0 f (n) cg (n) para n n0 .}
Isto , para valores de n sucientemente grandes, f (n) igual ou menor que g (n). Como abuso de notao, vamos escrever f (n) = O (g (n)) ao invs de f (n) O (g (n)). Algoritmo 1: f1 (n) = 2n2 + 5n = O (n2 ) Algoritmo 2: f2 (n) = 500n + 4000 = O (n)
Um polinmio de grau d de ordem O (nd ). Como uma constante pode ser considerada como um polinmio de grau 0, ento dizemos que uma constante O (n0 ) ou seja O (1).
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
Escreva a seguinte funo em notao O, sem provar: 4n2 + 10 log n + 500. Mesmo para a funo. 5nn + 102n Mesmo para a funo. 2(n 1)n + nn1
Complexidade de Algoritmos
Notao
Dada uma funo g (n), denotamos por (g (n)) o conjunto das funes
{ f (n) : constantes c e n0 tais que 0 cg (n) f (n) para n n0 .}
Isto , para valores de n sucientemente grandes, f (n) igual ou maior que g (n). Novamente, abusando a notao, vamos escrever f (n) = (g (n))).
Complexidade de Algoritmos
Notao
Dadas duas funes f (n) e g (n), temos f (n) = (g (n)) se e somente se f (n) = O (g (n))) e f (n) = (g (n))).
Complexidade de Algoritmos
Importncia
Considere 5 algoritmos com as complexidades de tempo. Suponhamos que uma operao leve 1 ms.
n 16 32 512 f1 ( n ) = n 0.016s 0.032s 0.512s f2 (n) = n log n 0.064s 0.16s 9s f3 (n) = n2 0.256s 1s 4m 22s f4 ( n ) = n 3 4s 33s 1 dia 13h f5 (n) = 2n 1m 4s 46 dias 10137 sculos
(Verique se resolveria usar uma mquina mais rpida onde uma operao leve 1 ps (pico segundo) ao invs de 1 ms: ao invs de 10137 sculos seriam 10128 sculos :-) Podemos muitas vezes melhorar o tempo de execuo de um programa otimizando o cdigo (e.g. usar x + x ao invs de 2x , evitar re-clculo de expresses j calculadas, etc.). Entretanto, melhorias muito mais substanciais podem ser obtidas se usarmos um algoritmo diferente, com outra complexidade de tempo, e.g. obter um algoritmo de O (n log n) ao invs de O (n2 ).
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
Importncia
Considere 5 algoritmos com as complexidades de tempo. Suponhamos que uma operao leve 1 ms.
n 16 32 512 f1 ( n ) = n 0.016s 0.032s 0.512s f2 (n) = n log n 0.064s 0.16s 9s f3 (n) = n2 0.256s 1s 4m 22s f4 ( n ) = n 3 4s 33s 1 dia 13h f5 (n) = 2n 1m 4s 46 dias 10137 sculos
(Verique se resolveria usar uma mquina mais rpida onde uma operao leve 1 ps (pico segundo) ao invs de 1 ms: ao invs de 10137 sculos seriam 10128 sculos :-) Podemos muitas vezes melhorar o tempo de execuo de um programa otimizando o cdigo (e.g. usar x + x ao invs de 2x , evitar re-clculo de expresses j calculadas, etc.). Entretanto, melhorias muito mais substanciais podem ser obtidas se usarmos um algoritmo diferente, com outra complexidade de tempo, e.g. obter um algoritmo de O (n log n) ao invs de O (n2 ).
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
Importncia
Considere 5 algoritmos com as complexidades de tempo. Suponhamos que uma operao leve 1 ms.
n 16 32 512 f1 ( n ) = n 0.016s 0.032s 0.512s f2 (n) = n log n 0.064s 0.16s 9s f3 (n) = n2 0.256s 1s 4m 22s f4 ( n ) = n 3 4s 33s 1 dia 13h f5 (n) = 2n 1m 4s 46 dias 10137 sculos
(Verique se resolveria usar uma mquina mais rpida onde uma operao leve 1 ps (pico segundo) ao invs de 1 ms: ao invs de 10137 sculos seriam 10128 sculos :-) Podemos muitas vezes melhorar o tempo de execuo de um programa otimizando o cdigo (e.g. usar x + x ao invs de 2x , evitar re-clculo de expresses j calculadas, etc.). Entretanto, melhorias muito mais substanciais podem ser obtidas se usarmos um algoritmo diferente, com outra complexidade de tempo, e.g. obter um algoritmo de O (n log n) ao invs de O (n2 ).
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
A cota superior de um problema pode mudar se algum descobrir um outro algoritmo melhor.
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
Note que a cota superior de um problema depende do algoritmo. Pode diminuir quando aparece um algoritmo melhor.
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
Seqncia de Fibonacci
Para projetar um algoritmo eciente, fundamental preocupar-se com a sua complexidade. Como exemplo: considere a seqncia de Fibonacci. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . . A seqncia pode ser denida recursivamente: if n = 0 0 1 if n = 1 Fn = Fn1 + Fn2 if n > 1 Dado o valor de n, queremos obter o n-simo elemento da seqncia. Vamos apresentar dois algoritmos e analisar sua complexidade.
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
Experimente rodar este algoritmo para n = 100 :-) A complexidade O (2n ). (Mesmo se uma operao levasse um picosegundo, 2100 operaes levariam 3 1013 anos = 30.000.000.000.000 anos.)
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
Experimente rodar este algoritmo para n = 100 :-) A complexidade O (2n ). (Mesmo se uma operao levasse um picosegundo, 2100 operaes levariam 3 1013 anos = 30.000.000.000.000 anos.)
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos
As vezes possvel demonstrar que, para um dado problema, qualquer que seja o algoritmo a ser usado, o problema requer pelo menos um certo nmero de operaes. Essa complexidade chamada cota inferior (lower bound) do problema. Note que a cota inferior depende do problema mas no do particular algoritmo.
Complexidade de Algoritmos
Para o problema de multiplicao de matrizes quadradas n n, apenas para ler os elementos das duas matrizes de entrada ou para produzir os elementos da matriz produto leva tempo O (n2 ). Assim uma cota inferior trivial (n2 ). Na analogia anterior, uma cota inferior de uma modalidade de atletismo no dependeria mais do atleta. Seria algum tempo mnimo que a modalidade exige, qualquer que seja o atleta. Uma cota inferior trivial para os 100 metros rasos seria o tempo que a velocidade da luz leva para percorrer 100 metros no vcuo.
Complexidade de Algoritmos
(n2 )
O (n2.376 ) O (nlog 7 )
O (n3 )
Se um algoritmo tem uma complexidade que igual cota inferior do problema, ento ele assintoticamente timo. O algoritmo de Coppersmith e Winograd de O (n2.376 ) mas a cota inferior (conhecida at hoje) de (n2 ). Portanto no podemos dizer que ele timo. Pode ser que esta cota superior possa ainda ser melhorada. Pode tambm ser que a cota inferior de (n2 ) possa ser melhorada (isto aumentada). Para muitos problemas interessantes, pesquisadores dedicam seu tempo tentando encurtar o intervalo (gap) at encostar as duas cotas.
Siang Wun Song - Universidade de So Paulo - IME/USP Complexidade de Algoritmos