Beruflich Dokumente
Kultur Dokumente
ear
Dados dois algoritmos diferentes para resolver o mesmo problema, como pode-
mos escolher qual desses algoritmos e o melhor? Se pensarmos em termos de
eficiencia (ou custo computacioanal), queremos saber qual desses algoritmos
consome menos recursos para realizar a mesma tarefa.
Em geral podemos responder essa pergunta de duas formas: em termos de
tempo ou de espaco.
Quando tratamos de eficiencia espacial, queremos saber quanta memoria
(em geral RAM) e utilizada pelo algoritmo para armazenar os dados, sejam
matrizes, vetores ou escalares.
Quando tratamos de eficiencia temporal, queremos saber quanto tempo um
algoritmo leva para realizar determinada tarefa. Vamos nos concentrar nessa
segunda opcao, que em geral e a mais difcil de ser respondida.
Obviamente o tempo vai depender do tipo de computador utilizado. E
razoavel de se pensar que o tempo vai ser proporcional ao numero de operacoes
de ponto flutuante (flops) feito pelo algoritmo (observe que o tempo total nao
depende apenas disso, mas tambem de outros fatores como memoria, taxas de
transferencias de dados da memoria para o cpu, redes,...). Entretanto vamos
nos concentrar na contagem do numero de operacoes (flops) para realizar deter-
minada tarefa.
No passado (antes dos anos 80), os computadores demoravam mais tempo
para realizar operacoes como multiplicacao e divisao, se comparados a soma
ou subtracao. Assim, em livros classicos eram contados apenas o custo das
operacoes e /. Nos computadores atuais as quatro operacoes basicas levam o
mesmo tempo. Entretanto, na maioria dos algoritmos de algebra linear o custo
associado as multiplicacoes e divisoes e proporcional ao custo das somas e sub-
tracoes (pois a maioria dessas operacoes podem ser escritas como a combinacao
de produtos internos). Dessa forma, na maior parte deste material levaremos em
conta somente multiplicacoes e divisoes, a nao ser que mencionado o contrario.
Tenha em mente que a ideia e estimar o custo a medida que o tamanho dos
vetores e matrizes cresce muito (para n grande).
O(n)flops (2)
~x ~y = x1 y1 + x2 y2 + ... + xn yn (3)
1
Sao realizadas n multiplicacoes (cada produto xi por yi ) e n 1 somas, ou
seja, o custo total de operacoes e
O(n) + O(n 1) = O(2n 1) flops (4)
Se contarmos apenas e /, teremos
O(n)flops (5)
2
1.5 Exemplo 4: Resolucao de um sistema triangular infe-
rior
Para resolver um sistema triangular inferior podemos usar o algoritmo de ret-
rosubstituicao.
1. function [x]=solveL(L,b) # L: matriz triangular inferior
2. n=size(L,1) # b: vetor
3. x(1)=b(1)/L(1,1)
4. for i=2:n
5. x(i)=(b(i)-L(i,1:i-1)*x(1:i-1) )/L(i,i)
6. end
7.endfunction
Vamos contar o numero total de flops para utilizar esse algoritmo.
Na linha 3, temos uma divisao, portanto 1 flop.
Na linha 5 quando i = 2, x(2)=(b(2)-L(2,1:1)*x(1:1))/L(2,2) temos 1
subtracao+1 multiplicacao + 1 divisao, ou seja, O(1 + 1 + 1) = O(3) flops.
Quando i = 3, x(3)=(b(3)-L(3,1:2)*x(1:2))/L(3,3) temos 1 subtracao+(2
multiplicacoes + 1 soma) +1 divisao, ou seja, O(1 + (2 + 1) + 1) = O(5) flops.
Quando i = 4, x(4)=(b(4)-L(4,1:3)*x(1:3))/L(4,4) temos 1 subtracao+(3
multiplicacoes + 2 somas) +1 divisao, ou seja, O(1 + (3 + 2) + 1) = O(7) flops.
...
Quando i = n, temos x(n)=(b(n)-L(n,1:n-1)*x(1:n-1))/L(n,n) temos
1 subtracao+(n-1 multiplicacoes + n-2 somas) +1 divisao, ou seja, O(1 + (n
1 + n 2) + 1) = O(2n 1) flops.
Somando todos esses custos temos que o custo para resolver um sistema
triangular inferior e
n
X n
X n
X
1 + 3 + 5 + 7 + ... + 2n 1 = (2k 1) = 2 k 1= (14)
k=1 k=1 k=1
3
Note que o custo sera o mesmo que o da resolucao de um sistema triangular
inferior.
n1
X n1
X
O( k2 + k) = O((n 1)n(2n 1)/6 + n(n 1)/2) = O(n3 /3 n/3) flops
k=1 k=1
(20)
contando somente multiplicacoes e divisoes.
4
1.8 Exemplo 5: Matrizes esparsas
Quando utilizamos matrizes esparsas (onde temos muitos elementos da matriz
iguais a zero, como numa matriz triangular, tridiagonal, diagonal,...) podemos
tomar vantagem desse conhecimento e nao realizar as multiplicacoes por zero
no algoritmo proposto. Veja o exemplo.
Qual o custo para multiplicar uma matriz tridiagonal T por uma matriz
diagonal D?
Teremos algo como (x representam elementos diferentes de zero)
[x x ] [x ]
[x x x ] [ x ]
T=[ x x x ], D=[ x ]
[ x x x] [ x ]
[ x x] [ x]
[1 1 0 0 ... 0]
de 2 flops.
Multiplicando a segunda linha de T por D afetaremos apenas 3 elmentos do
produto com 3 multiplicacoes.
[1 1 1 0 . . 0]
somando mais 3 flops. Note que todas as outras linhas (exceto a ultima) tera
tambem 3 flops. A ultima linha volta a ter 2 flops formando o padrao
[1 1 ]
[1 1 1 ]
TD=[ 1 1 1 ]
[ 1 1 1]
[ 1 1]