Você está na página 1de 6

Name Bubble sort Cocktail sort Comb sort Gnome sort Selection sort Insertion sort Shell sort

Binary tree sort Library sort Merge sort In-place merge sort Heapsort Smoothsort Quicksort Introsort Patience sorting Strand sort

Average O(n log n) O(n) O(n + d) O(n log n) O(n log n) O(n log n) O(n log n) O(n log n) O(n log n) O(n log n) O(n log n)

Worst Memory O(n) O(1) O(n) O(1) O(n log n) O(1) O(n) O(1) O(n) O(1) O(n) O(n log n) O(n log n) O(n) O(n log n) O(n log n) O(n log n) O(n log n) O(n) O(n log n) O(n) O(n) O(1) O(1) O(n) O(n) O(n) O(1) O(1) O(1) O(log n) O(log n) O(n) O(n)

Stable Yes Yes No Yes No Yes No Yes Yes Yes No No No No No No Yes

Method Other notes Exchanging Exchanging Exchanging Small code size Exchanging Tiny code size Selection Can be implemented as a stable sort d is the number of inversions, which is Insertion O(n) Insertion When using a self-balancing binary Insertion search tree Insertion Merging Merging Selection Selection Nave variants use O(n) space; can Partitioning be O(n log n) worst case if median pivot is used used in most implementations of Hybrid STL[citation needed] Finds all the longest increasing Insertion subsequences within O(n log n) Selection Example implementation here: [1]

Complexidade Computacional
Introduo
Pretende-se com esta pgina dar uma introduo a todos os interessados sobre Complexidade respondendo a certas questes chave tais como: O que a Complexidade? Porqu o estudo da Complexidade? Tipos de Complexidade. Upper e Lower Bound.

O que a Complexidade?
A Complexidade de um algoritmo consiste na quantidade de " trabalho " necessria 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.

Porqu o estudo da Complexidade?


Muitas vezes as pessoas quando comeam a estudar algoritmos perguntam-se qual a necessidade de desenvolver novos algoritmos para problemas que ja tm soluo. A performance extremamente importante na informtica pelo que existe uma necessidade constante de melhorar os algoritmos. Apesar de

parecer contraditrio, com o aumento da velocidade dos computadores, tornase cada vez mais importante desenvolver algoritmos mais eficientes, devido ao aumento constante do "tamanho" do problemas a serem resolvidos. Devido a este factor surge a Complexidade Computacional, pois e atravs dela que se torna possivel determinar se a implementao de determinado algoritmo viavel. A importncia da complexidade pode ser observada no exemplo abaixo, que mostra 5 algoritmos A1 a A5 para resolver um mesmo problema, de complexidades diferentes. Supomos que uma operao leva 1 ms para ser efectuada. A tabela seguinte d o tempo necessrio por cada um dos algoritmos. Tk(n) a complexidade do algoritmo. A3 T3(n)=n2 0.256s 1s 4m22s A4 T4(n)=n3 4s 33s 1 Dia 13h A5 T5(n)=2n 1m4s 46 Dias 10137 Sculos

n 16 32 512

A1 T1(n)= n 0.016s 0.032s 0.512s

A2 T2(n)=nlog n 0.064s 0.16s 9s

Tipos de Complexidade.
Espacial - Este tipo de complexidade representa o espao de memria usado para executar o algoritmo, por exemplo. Temporal - Este tipo de complexidade o mais usado podendo dividir-se em dois grupos: Tempo ( real ) necessrio execuo do algoritmo. Nmero de instrues necessrias execuo.

Para o estudo da complexide so usados trs perspectivas : Caso Pior Caso Melhor Caso Mdio

Caso Pior
Este mtodo normalmente representado por O ( ), por exemplo se dissermos que um determinado algoritmo representado por g(x) e a sua complexidade Caso Pior n, ser representada por g(x) = O(n). Consiste basicamente em assumir o pior dos casos que podem acontecer, sendo muito usado e sendo normalmente o mais fcil de determinar. Exemplos: Se por exemplo existirem cinco bas sendo que apenas um deles tem algo dentro e os outros esto vazios a complexidade caso pior ser O(5) pois eu no pior dos casos acerto no ba cheio quinta tentativa.

Caso Melhor
Representa-se por ( ) Mtodo que consiste em assumir que vai aconter o melhor. Pouco usado. Tem aplicao em poucos casos. Exemplos: Se tivermos uma lista de numeros e quisermos encontrar algum deles assumese que a complexidade caso melhor (1) pois assume-se que o numero estaria logo na cabea da lista.

Caso Mdio
Representa-se por (). Este mtodo dos trs o mais dificil de determinar pois necessita de anlise estatistica e como tal muitos testes. No entanto muito usado pois tambm o que representa mais correctamente a complexidade do algoritmo.

Upper Bound
Seja dado um problema, por exemplo, multiplicao de duas matrizes quadradas de ordem n (n*n). Conhecemos um algoritmo para resolver este problema(pelo mtodo trivial) de complexidade O(n 3). Sabemos assim que a complexidade deste problema no deve superar O(n 3), uma vez que existe um algoritmo desta complexidade que o resolve. Um limite superior ( upper bound ) deste problema O(n3). O limite superior de um algoritmo pode mudar se algum descobrir um algoritmo melhor. Isso de facto aconteceu com o algoritmo de Strassen que de O(nlog 7). Assim o limite superior do problema de multiplicao de matrizes passou a ser O(n log 7). Outros pesquisadores melhoraram ainda este resultado. Actualmente o melhor resultado o de Coppersmith e Winograd de O(n2.376). O limite superior de um algoritmo parecido com o record mundial de uma modalidade de atletismo. Ela estabelecida pelo melhor atleta ( algoritmo ) do momento. Assim como o record mundial o limite superior pode ser melhorado por um algoritmo ( atleta ) mais veloz.

Lower Bound
s vezes possivel demonstrar que para um dado problema, qualquer que seja o algorimo a ser usado o problema requer pelo menos um certo nmero de operaes. Essa complexidade chamada Limite inferior ( Lower Bound ). Veja que o limite inferior dependo do problema mas no do particular algoritmo. Usamos a letra em lugar de O para denotar um limite inferior. Para o problema de multiplicao de matrizes de ordem n, apenas para ler os elementos das duas matrizes de entrada leva O(n 2). Assim uma cota inferior trivial (n2). Na analogia anterior, um limite inferior de uma modalidade de atletismo no dependeria mais do atleta. Seria algum tempo minimo que a modalidade exige, qualquer que seja o atleta. Um limite inferior trivial para os 100 metros seria o tempo que a velocidade da luz leva a percorrer 100 metros no vcuo. Se um algoritmo tem uma complexidade que igual ao limite inferior do problema ento o algoritmo ptimo. O algoritmo de CopperSmith e Winograd de O(n2.376) mas o limite inferior de (n2). Portante no ptimo. Pode ser que este limite superior possa ainda ser melhorado.

Exemplo De Clculo de Complexidade:


Complexidade de um algoritmo de busca Algoritmo Busca( elemento:elemento, lista:lista): Se ListaVazia(lista) ento Falso Seno Se Cabea(lista) = Elemento ento Verdadeiro Seno Busca:= Busca (Elemento , Resto (lista)) // Instruo Recursiva Vamos chamar a este Algoritmo e sua complexidade O ( ). Podemos chamar a instruao 1 e 2 f(x) e instruo recursiva g(x). A complexidade do algoritmo pode-se calcular: O() = O( f(x) ) * O( g(x) ) O() = O( 2 * n ) O() = O(2n) // Instruo 2 // Instruco 1

O() = O(n)

Crescimento de Funes
N log N - tpico quando se reduz um problema em subproblemas, se resolve estes separadamente e se combinam as solues (se N 1 milho N log N perto de 20 milhes) N2 - tempo de execuo quadrtico (tpico quando preciso processar todos os pares de dados de entrada) (prtico apenas em pequenos problemas, ex: produto matriz - vector) N3 - tempo de execuo cbico (para N = 100, N3 = 1 milho, ex: produto de matrizes) 2N - tempo de execuo exponencial (provavelmente de pouca aplicao prtica; tpico em solues de fora bruta) (para N = 20, 2N = 1 milho; N duplica, tempo passa a ser o quadrado) Suponha o seguinte cdigo
for (i = 0; i < N; i++) { instrues; }

contabilizao do nmero de instrues simples: N iteraes e em cada uma so executadas um numero constante de instrues: O(N)

Suponha o cdigo seguinte:


for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { instrues; } }

contabilizao do nmero de instrues ainda simples: loop interno O(N) e executado N vezes: O(N2)

O que entendemos por tamanho de um problema?


O tamanho de um problema o tamanho da entrada do algoritmo que resolve o problema. Vejamos os seguintes exemplos: A busca em uma lista de N elementos ou a ordenao de uma lista de N elementos requerem mais operaes medida que N cresce; O clculo do fatorial de N tem o seu nmero de operaes aumentado com o aumento de N; A determinao do valor de F_N na sequncia de Fibonacci F_0, F_1, F_2, F_3, ... envolve uma quantidade de adies proporcional ao valor de N; e A determinao se um grafo tem um ciclo hamiltoniano (um ciclo que usa cada vrtice do grafo) fica mais complicada medida que o nmero de vrtices, N, cresce. Dizemos que o tamanho destes problemas N. Tipicamente utilizamos um nmero inteiro positivo, de forma que as funes, f(N), que exprimem a complexidade so funes de nmeros inteiros positivos, ou seja, f:Z+->R.

1. 2. 3. 4.

O que um problema polinomial (P)?


Um problema polinomial tem soluo de complexidade at ordem polinomial. Para entendermos melhor a ordem de grandeza de uma uma funo de complexidade de um problema, vamos introduzir a seguinte definio: Sejam f,g:Z+->R. Dizemos que g domina f (ou f dominada por g) se existe m pertencente a R+ e k a Z+, tais que |f(N)| <= m|g(N)| para todo N pertencente a

Z+, onde N >=k. Em outras palavras, f(N) dita dominada por g(N), se o limite de |f(N)|/|g(N)| com N tendendo a infinito igual a um valor real m. Se f dominada por g, dizemos ainda que f da ordem de grandeza g, ou seja f pertence a O(g) (l-se big-Oh de g). A ordem de grandeza das funes importante na anlise de complexidade de algoritmos. Ao invs de computarmos a funo exata do nmero de operaes necessrio, f(N), mais fcil e frequentemente vlido trabalharmos com a sua ordem de grandeza. claro que para uma mesma funo f(N) pode existir uma infinidade de funes limitantes superiores; mas o que se procura a menor fun&ccedi;o limitante superior para caracterizar a sua ordem de grandeza da complexidade. Um algoritmo com complexidade polinomial aquele que tem a sua funo de complexidade, f(N), majorada por uma funo g(N) de ordem polinomial (p. ex, g(N) = N ). Algoritmos com complexidade polinomial so computacionalmente tratveis, requerendo um tempo de execuo limitada por uma funo polinomial.

Você também pode gostar