Professional Documents
Culture Documents
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 tamanho dos dados de entrada, e como o tempo de execuo vai variar dentro de uma faixa constante, considerada constante a complexidade temporal. 1/10
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/10
3/10
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 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). 4/10
Podemos caracterizar a complexidade de um algoritmo em: Pior Caso (Grande O O): Procura-se definir um limite superior da complexidade. A notao mais comumente usada para medir complexidade de algoritmos o O, que d 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.
Exemplos: 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(3 n)
5/10
Algoritmos timos
Se a complexidade de um algoritmo a menor possvel, o algoritmo dito timo.
Otimizao
6/10
7/10
8/10
9/10
Exerccio
Pesquisar sobre o Grande Theta e sobre o Grande mega (definio, exemplos, aplicaes, ...).
10/10