Você está na página 1de 12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

Complexidade de Algoritmos
A complexidade de um algoritmo consiste na quantidade de trabalho necessrio 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. Um algoritmo tem duas medidas de complexidade: A complexidade temporal, que aproximadamente o nmero de instrues (tempo) que ele executa. A complexidade espacial, que a quantidade de memria que ele utiliza durante sua execuo. Ambas as complexidades so funes que tem como parmetro o tamanho da entrada a ser tratada. A complexidade, tanto espacial quanto temporal, de um algoritmo estimada em funo do tamanho da entrada. Logo importante estabelecer de que forma o tamanho da entrada influi no comportamento do algoritmo. Assim, se o algoritmo no recursivo, no contm iteraes e tambm no utiliza algoritmos que tem essas caractersticas, ento o nmero de passo independente do tamanho da entrada e digamos que a complexidade (temporal) constante.

Por exemplo, a rotina busca realiza sempre um teste na linha 5, e o nmero de atribuies sempre um ou zero. Nesse caso, o tempo de execuo independente do

1/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz
tamanho dos dados de entrada, e como o tempo de execuo vai variar dentro de uma faixa constante, considerada constante a complexidade temporal.

Por exemplo, suponha que um algoritmo consiste em uma iterao sobre os elementos de um vetor, e que a cada passo da iterao seja executado um nmero fixo k de instrues. Ento a complexidade do algoritmo ser em funo de n, o tamanho do vetor.

2/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

A avaliao do tempo de execuo pode ser realizada atravs de uma anlise da rotina maior. Atribuio de inicializao da linha 6 executado em um tempo constante k1. O lao da linha 7 at a linha 11 executado n-1 vezes e realiza os seguintes passos: 1. Atribuio da varivel i na linha 7 para 1 (ou i+1) em um tempo constante k2. 2. Teste da condio de parada na linha 7 em um tempo constante k3. 3. Teste na linha 8 em um tempo constante k4. 4. Se o teste da linha 8 for verdadeiro, realiza a atribuio da linha 9 em um tempo constante k5. Conseqentemente, o tempo total de execuo t : t <= k1 + (n-1) * (k2 + k3 + k4 + k5) t <= n * (k2 + k3 + k4 + k5) + (k1 k2 k3 k4 k5) t <= n * k, onde k uma constante. Neste caso a complexidade temporal kn, uma constante multiplicada pelo tamanho do vetor, e digamos que a complexidade temporal linear. Em relao ao espao ocupado pela rotina, alm dos parmetros, so usados somente as variveis locais. Logo a complexidade espacial tambm linear. Para avaliar a complexidade de uma funo escrita de forma recursiva, preciso analisar quantas vezes a funo deve ser chamada para chegar ao resultado esperado, e quantas operaes so executadas a cada chamada.

3/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

Para cada chamada recursiva de soma diminui em um o parmetro n, com exceo do parmetro zero, no qual o algoritmo termina. Se n o valor inicial, ento o nmero total de chamadas ser de n+1. A cada chamada sero realizadas as seguintes operaes: Teste na linha 5 em um tempo constante k1. Se o teste for verdadeiro, atribuio na linha 7 em um tempo constante k2. Se o teste for falso, atribuio na linha 9 em um tempo constante k3 (desconsiderando o tempo das chamadas recursivas). Logo, a complexidade temporal t deste algoritmo : t <= (n+1) * k1 + k2 + n*k3 t <= n * (k1 + k3) + k1 + k2 t <= n * k, onde k uma constante. O algoritmo tem uma chamada recursiva que diminui de 1 em cada chamada, ento haver n chamadas. Logo o algoritmo tem complexidade temporal linear. Geralmente, quando se avalia a complexidade de um algoritmo,a anlise feita de forma menos precisa. Primeiro porque muito trabalhoso contabilizar cada

4/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz
instruo. Segundo que o custo de executar cada instruo varia dependendo de vrios fatores. Assim, considera-se que um bloco de execues que executam uma nica vez considerado como um custo unitrio. O custo de executar um lao considerado como sendo o custo de executar o bloco dentro do lao multiplicado pelo nmero de vezes que o bloco executado. Assim, se temos c blocos de iteraes aninhadas, e que cada bloco efetua um nmero de iteraes dependendo de n, a complexidade temporal aproximadamente de n elevado a c (nc). As funes mais comuns para a classificao de complexidade de algoritmos so: constante logartimica linear quadrtica cbica polinomial exponencial um nmero constante de operaes log n n n2 n3 nk, onde k uma constante en

Podemos caracterizar a complexidade de um algoritmo em: Pior Caso (Grande O O): Procura-se definir um limite superior da complexidade. Caso Mdio (Grande Theta - ): Pretende-se obter uma caracterizao da complexidade para situaes tpicas. Freqentemente a caracterizao do caso mdio problemtica e necessita de uma anlise estatstica. Melhor Caso (Grande mega - ): Pouco usada, pois representa apenas casos especficos e no representativos.

Notao do O-Grande
A notao mais comumente usada para medir complexidade de algoritmos o O, que d um limite superior da complexidade.

5/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz Definio

+ + O( g ( n ) ) = { f ( x ) | c * , n0 * | 0 f ( x ) c * g ( x ) , n > n0 }

A notao O(g(n)) diz que existe um ponto n0 tal que para todos os tamanhos de entrada n superiores a n0, o custo inferior a algum mltiplo de g(n), ou seja, g(n) cresce mais rapidamente que f(n). Apesar da apresentao pouco intuitiva, a noo por trs da definio pode ser observada no grfico a seguir:

Por exemplo, dizer que o espao alocado pela execuo de um algoritmo O(n2), significa dizer que a quantidade mxima de memria usada no mxima uma funo quadrtica da entrada. importante observar que, na notao O, os termos de menor peso e os fatores podem ser eliminados. Assim, O(4*n3+10*n2) e O(n3) so sinnimos, mas o segundo mais simples e deve ser utilizado. Quando a complexidade de um algoritmo A O(f(n)), comum dizer simplesmente que A O(f(n)), e neste caso, entende-se que a complexidade temporal.

Exemplos:

6/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz
Soma de matrizes: complexidade = O(n2). Produto de matrizes: complexidade = O(n3). f(n) = n2 - 1 = O(n2) f(n) = 123 = O(1) f(n) = 3n + 5log n + 2 = O(n) f(n) = n3 + 1 = O(n3) f(n) = 7 + 5log n + 3log n = O(log n) f(n) = 8 * 3n + 6n7 = O(3n)

Algoritmos timos
Se a complexidade de um algoritmo a menor possvel, o algoritmo dito timo.

Otimizao

7/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

8/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

9/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

10/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

11/12

Centro de Cincias Exatas e Sociais Aplicadas

Curso de Cincia da Computao Estrutura de Dados II Professora Ms. Larissa Pavarini da Luz

Exerccio
Pesquisar sobre o Grande Theta e sobre o Grande mega (definio, exemplos, aplicaes, ...).

12/12

Você também pode gostar