Você está na página 1de 60

Anlise de Complexidade de Algoritmos

Algoritmos e Estruturas de Dados Sistemas de Informao - 2010/2o. sem Profa. Rosilane Mota

Medida de Tempo de Execuo


O projeto de algoritmos fortemente influenciado pelo estudo de seus comportamentos Depois que um problema analisado e decises de projeto so finalizadas, necessrio estudar as vrias opes de algoritmos a serem utilizados, considerando os aspectos de tempo de execuo e espao ocupado Muitos desses algoritmos so encontrados em reas como pesquisa operacional, otimizao, teoria dos grafos, estatstica, probabilidades, entre outras

Tipos de Problemas
Anlise de um algoritmo especfico
Qual o custo de usar um dado algoritmo para resolver um problema especfico? Caractersticas que devem ser investigadas:
Anlise do nmero de vezes que cada parte do algoritmo deve ser executada Estudo da quantidade de memria necessria

Tipos de Problemas
Anlise de uma classe de algoritmos
Qual o algoritmo de menor custo possvel para resolver um problema particular? Procura-se identificar um que seja o melhor possvel Coloca-se limites para a complexidade computacional dos algoritmos pertencentes classe

Custo do Algoritmo
Ao determinar o menor custo possvel para resolver problemas de uma dada classe, temos a medida da dificuldade inerente para resolver o problema. Quando o custo de um algoritmo igual ao menor custo possvel, o algoritmo timo para a medida de custo considerada. Podem existir vrios algoritmos para resolver o mesmo problema. Se a mesma medida de custo aplicada a diferentes algoritmos, ento possvel compar-los e escolher o mais adequado.

Medidas Reais
Tais medidas so bastante inadequadas e os resultados jamais devem ser generalizados:
os resultados so dependentes do compilador que pode favorecer algumas construes em detrimento de outras; os resultados dependem do hardware; quando grandes quantidades de memria so utilizadas, as medidas de tempo podem depender deste aspecto.

Medidas Reais
Apesar disso, h argumentos a favor de se obterem medidas reais de tempo.
Por exemplo, quando h vrios algoritmos distintos para resolver um mesmo tipo de problema, todos com um custo de execuo dentro de uma mesma ordem de grandeza. Assim, so considerados tanto os custos reais das operaes como os custos no aparentes, tais como alocao de memria, indexao, carga, dentre outros.

Medidas baseadas em Modelos Matemticos


Usa um modelo matemtico baseado em um computador idealizado. Deve ser especificado o conjunto de operaes e seus custos de execues. mais usual ignorar o custo de algumas das operaes e considerar apenas as operaes mais significativas. Por exemplo, algoritmos de ordenao:
consideramos o nmero de comparaes entre os elementos do conjunto a ser ordenado e ignoramos as operaes aritmticas, de atribuio e manipulaes de ndices, caso existam.

Tamanho da Entrada de Dados


A medida do custo de execuo de um algoritmo depende principalmente do tamanho da entrada dos dados. comum considerar o tempo de execuo de um programa como uma funo do tamanho da entrada. Para alguns algoritmos, o custo de execuo uma funo da entrada particular dos dados, no apenas do tamanho da entrada. Para um algoritmo de ordenao, se os dados de entrada j estiverem quase ordenados, ento o algoritmo pode ter que trabalhar menos.

Tempo de Execuo
Melhor caso:
Menor tempo de execuo sobre todas as entradas de tamanho n.

Pior caso:
Maior tempo de execuo sobre todas as entradas de tamanho n. Se f uma funo de complexidade baseada na anlise de pior caso, o custo de aplicar o algoritmo nunca maior do que f(n).

Caso mdio (ou caso esperado):


Mdia dos tempos de execuo de todas as entradas de tamanho n.

Tempo de Execuo
Na anlise do caso esperado, supe-se uma distribuio de probabilidades sobre o conjunto de entradas de tamanho n e o custo mdio obtido com base nessa distribuio. A anlise do caso mdio geralmente muito mais difcil de obter do que as anlises do melhor e do pior caso. comum supor uma distribuio de probabilidades em que todas as entradas possveis so igualmente provveis. Na prtica, isso nem sempre verdade.

Complexidade Computacional
Medida do grau de dificuldade de um algoritmo usada para avaliar sua eficincia Esforo para aplicar algoritmo
Quo custoso o algoritmo ?

Critrios de eficincia
Tempo (mais importante) Espao

Complexidade Computacional
Ambiente para anlise
Mesma mquina Mesma linguagem de programao Mesmos dados Programa compilado (rpido) x interpretado

Funo que expressa eficincia no deve ter unidade de medida (microsegundos, nanosegundos, etc) e sim, unidades lgicas (nmero de comparaes, nmero de elementos em um vetor, etc)

Complexidade Computacional
Para medir o custo de execuo de um algoritmo, comum definir uma funo de custo ou funo de complexidade f. f(n) a medida do tempo necessrio para executar um algoritmo para um problema de tamanho n. Funo de complexidade de tempo: f(n) mede o tempo necessrio para executar um algoritmo para um problema de tamanho n. Funo de complexidade de espao: f(n) mede a memria necessria para executar um algoritmo para um problema de tamanho n.

Complexidade Computacional
Utilizaremos f para denotar uma funo de complexidade de tempo daqui para a frente. Na realidade, a complexidade de tempo no representa tempo diretamente, mas o nmero de vezes que determinada operao considerada relevante executada.

Complexidade Computacional

Exemplo 1: Maior elemento


Considere o algoritmo para encontrar o maior elemento de um vetor de inteiros A[0..n-1], n 1.
static int Max (int[] A, int n) { int i, Temp; Temp = A[0]; for (i = 1; i < n; i++) { if (Temp < A[i]) Temp = A[i]; } return(Temp); }

Complexidade Computacional

Exemplo 1: Maior elemento

Seja f uma funo de complexidade tal que f(n) o nmero de comparaes entre os elementos de A, se A contiver n elementos.

Complexidade Computacional

Exemplo 1: Maior elemento


Logo, f(n) = n 1, para n 1 (melhor caso, pior caso e caso mdio).
static int Max (int[] A, int n) { int i, Temp; Temp = A[0]; for (i = 1; i < n; i++) { if (Temp < A[i]) Temp = A[i]; } return(Temp); }

Complexidade Computacional

Exemplo 1: Maior elemento


Vamos provar que o algoritmo apresentado no programa anterior timo. Teorema: Qualquer algoritmo para encontrar o maior elemento de um conjunto com n elementos, n 1, faz pelo menos n 1 comparaes. Prova: Cada um dos n 1 elementos tem de ser mostrado, por meio de comparaes, que menor do que algum outro elemento. Logo, n 1 comparaes so necessrias. O teorema acima nos diz que, se o nmero de comparaes for utilizado como medida de custo, ento a funo Max do programa anterior tima.

Complexidade Computacional

Exemplo 2: Maior e menor elementos


Considere o algoritmo para encontrar o maior e o menor elemento de um vetor de inteiros A[0..n-1], n 1.
static void MinMax1 (int[] A, int n, ref int Max, ref int Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; if (A[i] < Min) Min = A[i]; } }

Complexidade Computacional

Exemplo 2: Maior e menor elementos

Seja f uma funo de complexidade tal que f(n) o nmero de comparaes entre os elementos de A, se A contiver n elementos.

Complexidade Computacional

Exemplo 2: Maior e menor elementos


Logo, f(n) = 2(n 1), para n 1 (melhor caso, pior caso e caso mdio).
static void MinMax1 (int[] A, int n, ref int Max, ref int Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; if (A[i] < Min) Min = A[i]; } }

Complexidade Computacional

Exemplo 2: Maior e menor elementos


MaxMin1 pode ser facilmente melhorado:
a comparao A[i] < Min s necessria quando o resultado da comparao A[i] > Max for falso.
static void MinMax2 (int[] A, int n, ref int Max, ref int Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }

Complexidade Computacional

Exemplo 2: Maior e menor elementos


Para a nova implementao de MaxMin2 temos:
Melhor caso: f(n) = n 1
(quando os elementos esto em ordem crescente);

Pior caso: f(n) = 2(n 1)


(quando os elementos esto em ordem decrescente);

Caso mdio:

3n 3 f ( n) = 2 2

A[i] maior do que Max a metade das vezes. Logo, para n 1

n 1 3n 3 f ( n) = n 1 + = 2 2 2

Complexidade Computacional

Exemplo 2: Maior e menor elementos


Considerando o nmero de comparaes realizadas, existe a possibilidade de obter um algoritmo mais eficiente:
Compare os elementos de A aos pares, separandoos em dois subconjuntos (maiores em um e menores em outro), a um custo de n 2 comparaes.

Complexidade Computacional

Exemplo 2: Maior e menor elementos


Considerando o nmero de comparaes realizadas, existe a possibilidade de obter um algoritmo mais eficiente:
O mximo obtido do subconjunto que contm os maiores elementos, a um custo de n 2 1 comparaes. O mnimo obtido do subconjunto que contm os menores elementos, a um custo de n 2 1 comparaes.

Complexidade Computacional

Exemplo 2: Maior e menor elementos


static void MinMax3 (int[] A, int n, ref int Max, ref int Min) { int i, FimLoop; if (n % 2 > 0) { A[n] = A[n-1]; FimLoop = n-1; } else FimLoop = n-2; if (A[0] > A[1]) { Max = A[0]; Min = A[1]; } else { Max = A[1]; Min = A[0]; }

Complexidade Computacional

Exemplo 2: Maior e menor elementos


i= 2; while (i <= FimLoop) { if (A[i] > A[i+1]) { if (A[i] > Max) Max = if (A[i+1] < Min) Min } else { if (A[i] < Min) Min = if (A[i+1] > Max) Max } i= i + 2; } }

A[i]; = A[i+1];

A[i]; = A[i+1];

Complexidade Computacional

Exemplo 2: Maior e menor elementos


Os elementos de A so comparados dois a dois e os elementos maiores so comparados com Max e os elementos menores so comparados com Min. Quando n mpar, o elemento que est na posio A[n-1] duplicado na posio A[n] para evitar um tratamento de exceo. Para esta implementao (melhor caso, pior caso, caso mdio),

n n 2 n 2 3n f ( n) = + + = 2, 2 2 2 2

n 1

Complexidade Computacional

Exemplo 2: Maior e menor elementos


A tabela a seguir apresenta uma comparao entre os algoritmos dos programas MaxMin1, MaxMin2 e MaxMin3, considerando o nmero de comparaes como medida de complexidade.
Os algoritmos MaxMin2 e MaxMin3 so superiores ao algoritmo MaxMin1 de forma geral. O algoritmo MaxMin3 superior ao algoritmo MaxMin2 com relao ao pior caso e bastante prximo quanto ao caso mdio.

Complexidade Assinttica
Determinar a complexidade computacional com a relao exata entre dados (n) e tempo gasto (t) difcil Usa-se ordem de grandeza para determinar complexidade aproximada Complexidade assinttica: medida aproximada da funo original Para n pequeno, todos os algoritmos so rpidos. A complexidade analisada para valores grandes de n.

Complexidade Assinttica
Estuda-se o comportamento assinttico das funes de custo (comportamento de suas funes de custo para valores grandes de n). O comportamento assinttico de f(n) representa o limite do comportamento do custo quando n cresce.

Complexidade Assinttica
Calculada quando certos tempos sero desprezados ou quando difcil determinar a funo de eficincia Exemplo

f (n) = n + 100n + log10 n + 1000

Complexidade Assinttica

Complexidade Assinttica
Definio: Uma funo f(n) domina assintoticamente outra funo g(n) se existem duas constantes positivas c e n0 tais que, para n n0, temos |g(n)| c |f(n)|. Sejam g(n) = (n+1)2 e f(n) = n2. As funes g(n) e f(n) dominam assintoticamente uma a outra: |(n+1)2| 4|n2| para n 1 e |n2| |(n+1)2| para n 0.

Notaes Assintticas
Principais
Notao O (O grande) Notao Notao

Notao O (ou O-Grande)

Notao O (ou O-Grande)


Notao mais usada para especificar a complexidade assinttica Estima a taxa de crescimento da funo ou limite superior da funo Definio f(n) O(g(n)) se existem nmeros positivos c e N, tais que

f (n) c.g (n)

nN

g(n) Limite superior de f(n) f(n) cresce no mximo como g(n) f(n) da ordem de no mximo g(n)

Notao O
Exemplo
f (n) = 2 n 2 + 3n + 1 = O (n 2 ) onde g ( n) = n 2 3 1 + c 2 n n

2 n 2 + 3n + 1 cn 2 e 2 +

Notao O
Exemplo
f(n) = (n+1)2. f(n) = O(n2), quando N = 1 e c = 4, pois (n+1)2 4n2 para n 1.

Como a notao define o limite superior do algoritmo, ento a funo do pior caso utilizada como referncia para generalizao para satisfazer a relao para todas as entradas possveis.
O limite deve se aplicar a qualquer entrada!

Notao O
Problemas
Como calcular? Vrias combinaes de valores para c e N Vrias possibilidades para a funo g(n)
n2,n3,...,nk Escolher a menor funo, n2 Se escolher uma funo maior, a afirmao dita ser mais fraca que a envolvendo a menor funo.

Notao O
Propriedades

Notao O

Reviso Funes Matemticas

Notao

(Omega)

Notao
Definio f(n)

(Omega)

Estima o limite inferior da funo

(g(n)) se existem nmeros positivos c e N, tais que

0 c.g (n) f (n)

nN

g(n) Limite inferior de f(n) f(n) decresce no mnimo como g(n) f(n) da ordem de no mnimo g(n)

Notao

(Omega)

Como a notao define o limite inferior do algoritmo, ento a funo do melhor caso utilizada como referncia para generalizao para satisfazer a relao para todas as entradas possveis.
O limite deve se aplicar a qualquer entrada!

Notao (Theta)

Notao (Theta)
Estima o limite firme da funo Definio f(n) (g(n)) se existem nmeros positivos c1, c2 e N, tais que

c1.g (n) f (n) c2 .g (n)

nN

g(n) Limite firme de f(n) f(n) decresce no mnimo como g(n) f(n) cresce no mximo g(n)

Outras Notaes
Notao o (O-Pequeno): limite superior no firme Notao (Omega pequeno): limite inferior no firme

Comparao Algoritmos
Podemos avaliar programas comparando as funes de complexidade, negligenciando as constantes de proporcionalidade. Um programa com tempo de execuo O(n) melhor que outro com tempo O(n2).
Porm, as constantes de proporcionalidade podem alterar esta considerao.

Comparao Algoritmos
Exemplo: um programa leva 100n unidades de tempo para ser executado e outro leva 2n2. Qual dos dois programas melhor?
Depende do tamanho do problema. Para n < 50, o programa com tempo 2n2 melhor do que o que possui tempo 100n. Para problemas com entrada de dados pequena prefervel usar o programa cujo tempo de execuo O(n2). Entretanto, quando n cresce, o programa com tempo de execuo O(n2) leva muito mais tempo que o programa O(n).

Classes de Comportamento
Complexidade Constante
f(n) = O(1) O uso do algoritmo independe do tamanho de n. As instrues do algoritmo so executadas um nmero fixo de vezes.

Classes de Comportamento
Complexidade Logartmica
f(n) = O(log n) Ocorre tipicamente em algoritmos que resolvem um problema transformando-o em problemas menores. Nestes casos, o tempo de execuo pode ser considerado como sendo menor do que uma constante grande
Para n = 1000, log2 10

Classes de Comportamento
Complexidade Linear
f(n) = O(n) Em geral, um pequeno trabalho realizado sobre cada elemento de entrada. Esta a melhor situao possvel para um algoritmo que tem que processar/produzir n elementos de entrada/sada. Cada vez que n dobra de tamanho, o tempo de execuo tambm dobra.

Classes de Comportamento
Complexidade Linear Logartmica
f(n) = O(n log n) Este tempo de execuo ocorre tipicamente em algoritmos que resolvem um problema quebrando-o em problemas menores, resolvendo cada um deles independentemente e depois agrupando as solues. Caso tpico dos algoritmos baseados no paradigma diviso-e-conquista.

Classes de Comportamento
Complexidade Quadrtica
f(n) = O(n2) Algoritmos desta ordem de complexidade ocorrem quando os itens de dados so processados aos pares, muitas vezes em um loop (repetio) dentro do outro. Para n = 1000, o nmero de operaes da ordem de 1.000.000. Sempre que n dobra, o tempo de execuo multiplicado por 4. Algoritmos deste tipo so teis para resolver problemas de tamanhos relativamente pequenos.

Classes de Comportamento
Complexidade Cbica
f(n) = O(n3) Para n = 100, o nmero de operaes da ordem de 1.000.000 Sempre que n dobra o tempo de execuo multiplicado por 8. Algoritmos deste tipo so teis para resolver problemas de tamanhos relativamente pequenos.

Classes de Comportamento
Complexidade Exponencial
f(n) = O(2n) Algoritmos desta ordem de complexidade no so teis sob o ponto de vista prtico. Eles ocorrem na soluo de problemas quando se usa a fora bruta para resolv-los. Para n = 20, o tempo de execuo cerca de 1.000.000. Sempre que n dobra, o tempo de execuo fica elevado ao quadrado.

Classes de Comportamento
Complexidade Exponencial
f(n) = O(n!) Um algoritmo de complexidade O(n!) dito ter complexidade exponencial, apesar de O(n!) ter comportamento muito pior do que O(2n). Geralmente, ocorrem quando se usa fora bruta na soluo do problema.