Você está na página 1de 29

' $

Análise de complexidade

Algoritmos polinomiais

& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade computacional

• Função de complexidade para medir o custo de execução de um programa.


• Esta função pode ser tanto uma medida do tempo para executar o algoritmo
que resolve um problema de tamanho n quanto o espaço de memória requerido
para esta execução.
• Complexidade computacional de um algoritmo se refere à estimativa do
esforço computacional despendido para resolver o problema.
• Pode ser medida pelo número necessário de operações aritméticas e lógicas
como, por exemplo, o número de adições, multiplicações e divisões efetuadas
para resolver um sistema linear de ordem n.

2012
c FFCf 2
& %
' $
Análise de complexidade Algoritmos polinomiais

Tipos de complexidade

• Os problemas possuem complexidade de tempo que pode ser enquadrada em


dois grupos:
– Algoritmos polinomiais, sendo a função de complexidade da forma
O(cpnp + cp−1np−1 + . . . + c1n + c0).
– Algoritmos exponenciais, onde a função de complexidade tem a forma
O(cn), c > 1.
• Número de multiplicações utilizadas para resolver um sistema triangular
inferior de ordem n usando as substituições sucessivas é O( 12 n2 − 12 n) ou
O(n2).
• Número de adições necessárias para fazer a decomposição LU de uma matriz
de ordem n é O( 13 n3 − 12 n2 + 16 n), ou, simplesmente, O(n3).

2012
c FFCf 3
& %
' $
Análise de complexidade Algoritmos polinomiais

Tempo relativo das operações aritméticas

• O tempo para executar cada uma das operações aritméticas depende de vários
fatores, tais como, a arquitetura do microprocessador, sua frequência (clock),
número de ciclos e tipo do dado (inteiro ou ponto flutuante).
• Aproximadamente, o tempo relativo para executar uma operação é: adição (e
subtração) = 1, multiplicação = 2 e divisão = 9.
• A função de complexidade será definida, separadamente, para adição,
multiplicação e divisão, sendo uma subtração contada como uma adição.

2012
c FFCf 4
& %
' $
Análise de complexidade Algoritmos polinomiais

Análise de complexidade

• Algumas propriedades de soma de sequências, sendo a e b constantes:


Xn
a = a(n − m + 1), (1)
i=m
n
X n(n + 1) 1 2 1
i= = n + n, (2)
2 2 2
i=1
n
X n[a(n + 1) + 2b] a 2 a + 2b
(ai + b) = = n + n, (3)
2 2 2
i=1
n
X a(n2 − m2) + (a + 2b)(n − m)
(ai + b) = , (4)
2
i=m
n
X
2 n(n + 1)(2n + 1) a 3 a 2 a
ai = a = n + n + n. (5)
6 3 2 6
i=1

2012
c FFCf 5
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade linear: algoritmo de Horner

Exemplo 1 Seja o algoritmo para avaliar um polinômio de grau n no ponto a.


Algoritmo Horner
{ Objetivo: Avaliar um polinômio de grau n no ponto a }
parâmetros de entrada n, c, a
{ grau, coeficientes e ponto a ser avaliado, onde c é tal que }
{ P (x) = c(1 )xn + c(2 )xn−1 + · · · + c(n)x + c(n+1 ) }
parâmetro de saı́da y { ordenada P (a) }
y ← c(1 )
para i ← 2 até n + 1 faça
y ← y ∗ a + c(i)
fimpara
fimalgoritmo

2012
c FFCf 6
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade linear

• Indicando somente a quantidade das operações aritméticas, tem-se


Algoritmo Horner
para i ← 2 até n + 1 faça
+ : 1, ∗ : 1
fimpara
fimalgoritmo

• A operação de adição (+) e a operação de multiplicação (∗) ocorrem apenas


uma vez e na estrutura para−faça controlada pela variável i.
• Número de operações de adição A(n) e de multiplicação M (n), em função do
grau n do polinômio, em vista de (1), é
n+1
X
A(n) = M (n) = 1 = 1(n + 1 − 2 + 1),
i=2
A(n) = M (n) = n.

2012
c FFCf 7
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade quadrática: substituições sucessivas

Exemplo 2 Considere o algoritmo de substituições sucessivas,


Algoritmo Substituições Sucessivas
{ Objetivo: Resolver o sistema triangular inferior Lx = c }
{ pelas substituições sucessivas }
parâmetros de entrada n, L, c
{ ordem, matriz triangular inferior e vetor independente }
parâmetro de saı́da x { solução do sistema triangular inferior }
x(1 ) ← c(1 )/L(1 , 1 )
para i ← 2 até n faça
Soma ← 0
para j ← 1 até i − 1 faça
Soma ← Soma + L(i, j) ∗ x(j)
fimpara
x(i) ← (c(i) − Soma)/L(i, i)
fimpara
fimalgoritmo

2012
c FFCf 8
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade quadrática: adições

• Mostrando apenas a quantidade das operações aritméticas dentro das


estruturas de repetição,
Algoritmo Substituições Sucessivas
/: 1
para i ← 2 até n faça
para j ← 1 até i − 1 faça
+ : 1, ∗ : 1
fimpara
+ : 1, / : 1
fimpara
fimalgoritmo

• Número de adições A(n) em função da ordem n da matriz, considerando


(1)–(2), é
 
n i−1 n n
X X X X n(n + 1)
A(n) =  (1) + 1 =
 [1(i − 1) + 1] = [i] − 1 = − 1,
2
i=2 j=1 i=2 i=1
1 2 1
A(n) = n + n − 1.
2 2

2012
c FFCf 9
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade quadrática: multiplicações

Algoritmo Substituições Sucessivas


/: 1
para i ← 2 até n faça
para j ← 1 até i − 1 faça
+ : 1, ∗ : 1
fimpara
+ : 1, / : 1
fimpara
fimalgoritmo

• Número de multiplicações M (n) em função da ordem n é


     
Xn Xi−1 X n Xn Xn Xn Xn
M (n) =  (1) = [i − 1] = i− 1 = [i]−1− [1]−1,
i=2 j=1 i=2 i=2 i=2 i=1 i=1
 
n(n + 1)
M (n) = − 1 − (n − 1),
2
1 2 1
M (n) = n − n.
2 2

2012
c FFCf 10
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade quadrática: divisões

Algoritmo Substituições Sucessivas


/: 1
para i ← 2 até n faça
para j ← 1 até i − 1 faça
+ : 1, ∗ : 1
fimpara
+ : 1, / : 1
fimpara
fimalgoritmo

• Número de divisões D(n) em função de n é


n
X n
X
D(n) = 1 + [1] = 1 + [1] − 1 = 1 + n − 1,
i=2 i=1
D(n) = n.

2012
c FFCf 11
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade quadrática: polinômio de Lagrange

Exemplo 3 Seja o polinômio interpolador de Lagrange de grau n


n n
X Y x − xj
Ln(x) = yi .
xi − xj
i=0 j=0
j 6= i

• Expandindo, resulta a Expressão 1

x − x1 x − x2 x − xn
Ln(x) = y0 × × × ... ×
x0 − x1 x0 − x2 x0 − xn

x − x0 x − x2 x − xn
+ y1 × × × ... ×
x1 − x0 x1 − x2 x1 − xn

x − x0 x − x1 x − xn−1
. . . + yn × × × ... × .
xn − x0 xn − x1 xn − xn−1

2012
c FFCf 12
& %
' $
Análise de complexidade Algoritmos polinomiais

Polinômio de Lagrange: expressão 1

Algoritmo Lagrange Expressão 1


{ Objetivo: Interpolar usando polinômio de Lagrange }
parâmetros de entrada m, x, y , z
{ número de pontos, abscissas }
{ ordenadas e valor a interpolar }
parâmetro de saı́da r { valor interpolado }
r ←0
para i ← 1 até m faça
p ← y (i)
para j ← 1 até m faça
se i 6= j então
p ← p ∗ ((z − x(j))/(x(i) − x(j)))
fimse
fimpara
r ←r +p
fimpara
fimalgoritmo

2012
c FFCf 13
& %
' $
Análise de complexidade Algoritmos polinomiais

Polinômio de Lagrange: multiplicações e divisões

Algoritmo Lagrange Expressão 1


para i ← 1 até m faça
para j ← 1 até m faça
se i 6= j então
+ : 2, ∗ : 1, / : 1
fimse
fimpara
+: 1
fimpara
fimalgoritmo

• Número de multiplicações M (m) e divisões D(m) em função do número m de


pontos usados na interpolação, em vista de (1), são dados por
 
 
X m  X m 
 Xm m−1 X Xm
M (m) = D(m) = 
 (1) =

 (1) = [1(m − 1)],
i=1  j = 1  i=1 j=1 i=1
j 6= i

M (m) = D(m) = m(m − 1) = m2 − m.

2012
c FFCf 14
& %
' $
Análise de complexidade Algoritmos polinomiais

Polinômio de Lagrange: adições

Algoritmo Lagrange Expressão 1


para i ← 1 até m faça
para j ← 1 até m faça
se i 6= j então
+ : 2, ∗ : 1, / : 1
fimse
fimpara
+: 1
fimpara
fimalgoritmo

• Número de adições A(m) em função de m é


 
 
X m   Xm 
 X m m−1X Xm
A(m) = 
 (2) + 1=

 (2) + 1 = [2(m − 1) + 1],
i=1  j = 1  i=1 j=1 i=1
j 6= i
m
[2m − 1] = m(2m − 1) = 2m2 − m.
X
A(m) =
i=1

2012
c FFCf 15
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade em função do grau n

• Número de pontos m usados na interpolação é igual a n + 1, onde n é o grau


do polinômio, então
A(n) = 2m2 − m = 2(n + 1)2 − (n + 1) = 2n2 + 3n + 1,
M (n) = m2 − m = (n + 1)2 − (n + 1) = n2 + n,
D(n) = m2 − m = (n + 1)2 − (n + 1) = n2 + n.

Operações Complexidade
adições 2n2 + 3n + 1
.
multiplicações n2 + n
divisões n2 + n

2012
c FFCf 16
& %
' $
Análise de complexidade Algoritmos polinomiais

Polinômio de Lagrange: expressão 2

Exemplo 4 O polinômio de Lagrange também pode ser expandido de modo a


resultar a Expressão 2

(x − x1) × (x − x2) × . . . × (x − xn)


Ln(x) = y0 ×
(x0 − x1) × (x0 − x2) × . . . × (x0 − xn)

(x − x0) × (x − x2) × . . . × (x − xn)


+ y1 ×
(x1 − x0) × (x1 − x2) × . . . × (x1 − xn)

(x − x0) × (x − x1) × . . . × (x − xn−1)


. . . + yn × .
(xn − x0) × (xn − x1) × . . . × (xn − xn−1)

2012
c FFCf 17
& %
' $
Análise de complexidade Algoritmos polinomiais

Algoritmo do polinômio de Lagrange: expressão 2

Algoritmo Polinômio Lagrange


{ Objetivo: Interpolar valor em tabela usando polinômio de Lagrange }
parâmetros de entrada m, x, y , z
{ número de pontos, abscissas, ordenadas e valor a interpolar }
parâmetro de saı́da r { valor interpolado }
r ←0
para i ← 1 até m faça
c ← 1; d ← 1
para j ← 1 até m faça
se i 6= j então
c ← c ∗ (z − x(j)); d ← d ∗ (x(i) − x(j))
fimse
fimpara
r ← r + y (i) ∗ c/d
fimpara
fimalgoritmo

2012
c FFCf 18
& %
' $
Análise de complexidade Algoritmos polinomiais

Polinômio de Lagrange: adições e multiplicações

Algoritmo Polinômio Lagrange


para i ← 1 até m faça
para j ← 1 até m faça
se i 6= j então
+ : 2, ∗ : 2
fimse
fimpara
+ : 1, ∗ : 1, / : 1
fimpara
fimalgoritmo

• Número de adições A(m) e multiplicações M (m) em função de m é, por (1),


 
 
Xm  X m 
 X m m−1X Xm
A(m) = M (m) = 
 (2) + 1=

 (2) + 1 = [2(m−1)+1],
i=1  j = 1  i=1 j=1 i=1
j 6= i
m
[2m − 1] = m(2m − 1) = 2m2 − m.
X
A(m) = M (m) =
i=1

2012
c FFCf 19
& %
' $
Análise de complexidade Algoritmos polinomiais

Polinômio de Lagrange: divisões

Algoritmo Polinômio Lagrange


para i ← 1 até m faça
para j ← 1 até m faça
se i 6= j então
+ : 2, ∗ : 2
fimse
fimpara
+ : 1, ∗ : 1, / : 1
fimpara
fimalgoritmo

• Número de divisões D(m) em função do número m de pontos usados na


interpolação é
Xm
D(m) = 1 = m.
i=1

2012
c FFCf 20
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade em função do grau n

• Complexidade computacional do algoritmo em função do grau n (= m − 1)


A(n) = 2m2 − m = 2(n + 1)2 − (n + 1) = 2n2 + 3n + 1,
M (n) = 2m2 − m = 2(n + 1)2 − (n + 1) = 2n2 + 3n + 1,
D(n) = m = n + 1.

2012
c FFCf 21
& %
' $
Análise de complexidade Algoritmos polinomiais

Comparação das complexidades

Operações Complexidade Operações Complexidade


adições 2n2 + 3n + 1 adições 2n2 + 3n + 1
multiplicações n2 + n multiplicações 2n2 + 3n + 1 .
divisões n2 + n divisões n+1
Expressão 1 Expressão 2
• Comparando os resultados das duas expressões, nota-se que o número de
adições é o mesmo e o de multiplicações é da mesma ordem O(n2).
• O número de divisões utilizado pela Expressão 2 é de uma ordem de grandeza
a menos.
• O polinômio de Lagrange serve para exemplificar que uma mesma notação
matemática pode resultar em algoritmos de diferentes complexidades.
• Isto deve ser lembrado ao se elaborar um algoritmo.
2012
c FFCf 22
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade cúbica

Exemplo 5 Considere o algoritmo de decomposição LDLT , sem considerar as


operações para o cálculo do determinante.
Algoritmo Decomposição LDLT
{ Objetivo: Fazer a decomposição LDLT de uma matriz A }
{ simétrica e definida positiva }
parâmetros de entrada n, A { ordem e matriz a ser decomposta }
parâmetros de saı́da A, Det
{ matriz decomposta A = L − I + D e determinante }
Det ← 1
para j ← 1 até n faça
Soma ← 0
para k ← 1 até j − 1 faça
Soma ← Soma + A(j, k)2 ∗ A(k, k)
fimpara
A(j, j) ← A(j, j) − Soma
r = 1 /A(j, j); Det ← Det ∗ A(j, j)
para i ← j + 1 até n faça
Soma ← 0
para k ← 1 até j − 1 faça
Soma ← Soma + A(i, k) ∗ A(k, k) ∗ A(j, k)
fimpara
A(i, j) ← (A(i, j) − Soma) ∗ r
fimpara
fimpara
fimalgoritmo

2012
c FFCf 23
& %
' $
Análise de complexidade Algoritmos polinomiais

complexidade cúbica: adições

Algoritmo Decomposição LDLT


para j ← 1 até n faça
para k ← 1 até j − 1 faça
+ : 1, ∗ : 2
fimpara
+ : 1, / : 1
para i ← j + 1 até n faça
para k ← 1 até j − 1 faça
+ : 1, ∗ : 2
fimpara
+ : 1, ∗ : 1
fimpara
fimpara
fimalgoritmo

• Número de adições A(n) em função da ordem n da matriz é


  
Xn X j−1 Xn Xj−1 
A(n) = (1) + 1 +  (1) + 1 ,
 
j=1 k=1 i=j+1 k=1

2012
c FFCf 24
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade cúbica: adições cont.

  
n X
X j−1 Xn j−1
X 
A(n) = (1) + 1 +  (1) + 1 ,
 
j=1 k=1 i=j+1 k=1
 
Xn  Xn 
= (j − 1) + 1 + [(j − 1) + 1] ,
 
j=1 i=j+1
n n
{(n + 1)j − j 2}, ver (5)
X X
= {j + j[n − (j + 1) + 1]} =
j=1 j=1
n(n + 1) n(n + 1)(2n + 1)
= (n + 1) − ,
2 6
1 3 1 2 1
A(n) = n + n + n.
6 2 3

2012
c FFCf 25
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade cúbica: multiplicações

Algoritmo Decomposição LDLT


para j ← 1 até n faça
para k ← 1 até j − 1 faça
+ : 1, ∗ : 2
fimpara
+ : 1, / : 1
para i ← j + 1 até n faça
para k ← 1 até j − 1 faça
+ : 1, ∗ : 2
fimpara
+ : 1, ∗ : 1
fimpara
fimpara
fimalgoritmo

• Considerando (1)–(5), o número de multiplicações M (n) em função da ordem


n é   
Xn X j−1 Xn j−1
X 
M (n) = (2) +  (2) + 1 ,
 
j=1 k=1 i=j+1 k=1

2012
c FFCf 26
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade cúbica: multiplicações cont.


 
Xn  X n 
M (n) = 2(j − 1) + [2(j − 1) + 1] ,
 
j=1 i=j+1
 
Xn  X n Xn 
= 2j − 2 + [2j] − [1] ,
 
j=1 i=j+1 i=j+1
Xn
= {2j − 2 + 2j(n − (j + 1) + 1) − (n − (j + 1) + 1)},
j=1
n n n
2j 2 −
X X X
= (2n+3)j − (n + 2), ver (5)
j=1 j=1 j=1
n(n + 1) n(n + 1)(2n + 1)
= (2n + 3) −2 − n(n + 2),
2 6
1 3 1 2 5
M (n) = n + n − n.
3 2 6
2012
c FFCf 27
& %
' $
Análise de complexidade Algoritmos polinomiais

Complexidade cúbica: divisões

Algoritmo Decomposição LDLT


para j ← 1 até n faça
para k ← 1 até j − 1 faça
+ : 1, ∗ : 2
fimpara
+ : 1, / : 1
para i ← j + 1 até n faça
para k ← 1 até j − 1 faça
+ : 1, ∗ : 2
fimpara
+ : 1, ∗ : 1
fimpara
fimpara
fimalgoritmo

• Número de operações de divisão D(n) em função da ordem n da matriz é


Xn
D(n) = 1,
j=1
D(n) = n.

2012
c FFCf 28
& %
' $
Análise de complexidade Algoritmos polinomiais

Fim

Análise de complexidade

2012
c FFCf 29
& %