Escolar Documentos
Profissional Documentos
Cultura Documentos
Complexidade de Algoritmos - IME
Complexidade de Algoritmos - IME
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) = n3 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) = n3 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) = n3 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