CÁLCULO DE COMPLEXIDADE
José de Siqueira UFMG - ICEx - DCC
Cál ulo de Complexidade de Programas
•
Contagem do número de operações de ada tipo.•
Para isso, é pre iso:determinar as operações relevantes.
determinar o número de vezes que essas operações são exe utadas
não se onsideram sobre argas de geren iamento de memória ou E/S
•
Em geral, estamos interessados na omplexidade no pior aso.Cál ulo de Complexidade de Programas
•
Operações em seqüên ia: adi ionam-se os ustos de ada operação.Regras de Transformação
T (
read)
→ 1
T (
write)
→ 1
T (
a := b)
→ 1
T (
a>
b)
(e outros op. lógi os)→ 1
T (
a+
b)
(e outros op. aritméti os)→ 1
T (
ifa
thenb
elsec)
→ T (a) +
max(T (b)
,T (c)
)T (
for i := 1 to n doa
i
)
→
X
1≤i≤n
T (a
i
)
•
Outros laços: limite superior.•
Para funções ou pro edimentos: ordem de hamada das funções.•
Funções ou pro edimentos re ursivos: relações de re orrên ia.Exemplo 1
fun tion fat(n:integer):integer; begin
if n = 0 then fat := 1 else fat := n
∗
fat(n-1); end; % fat•
Operação fundamental:∗
.•
SejaT (n)
o n o de operações fundamentais:
T (0) = 0
T (n) = 1 + T (n − 1),
paran ≥ 1
•
Resolução da eq. de re orrên ia:T (0) = 0
T (1) = 1 + T (0)
= 1
T (2) = 1 + T (1)
= 2
. . .T (n) = 1 + T (n − 1) = n
Exemplo 2
. . .
onst n = 1000;
type Vetor = array [1..n℄ of integer;
. . .
fun tion Max(var A: Vetor): integer; var i, aux: integer;
begin
aux := A[1℄;
for i:= 2 to n do
if aux
<
A[i℄ then aux := A[i℄; Max := aux;end; % Max
•
Operação fundamental: omparação.•
SejaT (n)
o n ode omparações.
•
Se A tivern
elementos,T (n) = n − 1
.•
O algoritmo é ótimo (tem o menor usto possível).Cál ulo de Complexidade de Programas
•
Três enários possíveis:1. Melhor aso: menor tempo de exe ução para todas entradas possíveis de tamanho
n
.2. Pior aso: maior tempo de exe ução
. . .
O usto de um algoritmo nun a é maior que o pior aso.3. Caso médio (ou esperado): média dos tempos de exe ução
. . .
Supõe uma distribuição de probabilidades sobre o onjunto de entrada de tamanhon
.Exemplo 3
•
Pesquisa seqüen ial: en ontrar uma have dada dentre os registros de um arquivo.•
Sejaf (n)
o n ode registros onsultados: melhor aso:
f (n) = 1
.Exemplo 3
Cál ulo do aso médio
•
Hipótese: todos elementos são distintos.•
Sejaq
a probabilidade de que a have X esteja no arquivo A.•
Hipótese: Se X está em A, todas as posições são eqüiprováveis.•
Notação: SejaD
n,i
, 1 ≤ i ≤ n
o onjunto de dados onde X apare e na i-ésima posição.• D
n,0
é o onjunto de dados do qual X está ausente.•
Assim,p(D
n,i
) =
q
n
ep(D
n,0
) = 1 − q.
•
Pela análise do algoritmo, temos:usto
(D
n,i
) = i
e usto(D
n,0
) = n
•
Assim,f
médio(n) =
X
0≤i≤n
p(D
n,i
) ∗
usto(D
n,i
)
= (1 − q) · n +
X
1≤i≤n
i ·
q
n
•
Se sabemos que X está em A, temos queq = 1
ef
médio
(n) =
n + 1
2
•
Se há uma han e em duas de que X esteja em A, entãoq =
1
2
ef
médio(n) =
n
2
+
n + 1
4
=
3n + 1
4
•
Cal ular o maior e o menor elemento de um vetor•
Versão 1:pro edure MaxMin1(var A: Vetor; var Max, Min: integer);
var i: integer; begin Max := A[1℄; Min := A[1℄; for i := 2 to n do begin
if A[i℄
>
Max then Max := A[i℄; if A[i℄<
Min then Min := A[i℄; end;end; % MaxMin1
•
Sejaf (n)
o n ode omparações entre os elementos de A.
•
Quanto valef (n)
para o melhor aso, o pior aso e o aso médio?Exemplo 4 - Continuação
•
Versão 2:pro edure MaxMin2(var A: Vetor; var Max, Min: integer); var i: integer; begin Max := A[1℄; Min := A[1℄; for i := 2 to n do begin
if A[i℄
>
Max then Max := A[i℄else if A[i℄
<
Min then Min := A[i℄; end;end; % MaxMin2
•
Para esta versão, temos:melhor aso:
f (n) = n − 1
(dados em ordem res ente)pior aso:
f (n) = 2(n − 1)
(dados em ordem de res ente)f (n) = n − 1 +
n − 1
2
=
3n
2
−
3
2
•
É possível melhorar esta versão ainda mais?•
Algoritmo:1. Compare os elementos de A aos pares (
⌈n/2⌉
omparações).2. Obtenha o máximo do sub onjunto dos
maiores elementos (
⌈n/2 − 1⌉
omparações). 3. Obtenha o mínimo do sub onjunto dosmenores elementos (
⌈n/2 − 1⌉
omparações).•
A notação⌈x⌉
é hamada de teto dex
e retorna a parte inteira superior do argumento real.•
Da mesma forma, o operador piso dex
,⌊x⌋
,•
Versão 3:pro edure MaxMin3(var A:Vetor;var Max,Min:integer); var i, Fim: integer;
begin
if (n mod 2)
>
0 then beginA[n+1℄ := A[n℄; % A[n+1℄ é sentinela para % vetor de tamanho ímpar Fim := n; % Fim determina até onde omparar end
else Fim := n-1;
if A[1℄
>
A[2℄ % Determina Max e Min ini iais then begin Max := A[1℄; Min := A[2℄; end; else begin Max := A[2℄; Min := A[1℄; end; i:= 3;while i
≤
Fim do % O laço não trata asos% espe iais begin
if A[i℄ > A[i+1℄ then begin
if A[i℄
>
Max then Max := A[i℄; if A[i+1℄<
Min then Min := A[i+1℄; endelse begin
if A[i℄
<
Min then Min := A[i℄; if A[i+1℄>
Max then Max := A[i+1℄; end;Versão 3 - Análise de Complexidade
•
Para esta versão, o usto nos três asos é:f (n) =
n
2
+
n − 2
2
+
n − 2
2
=
3n
2
− 2,
paran > 0.
Comparação da Complexidade dos 3 Algoritmos Os trêsf (n)
algoritmos Melhor aso Pior aso Caso médio MaxMin1
2(n − 1)
2(n − 1)
2(n − 1)
MaxMin2n − 1
2(n − 1) 3n/2 − 3/2
MaxMin33n/2 − 2
3n/2 − 2
3n/2 − 2
É possível aumentar ainda mais a e iên ia do 3o algoritmo?
•
Versão 4 (Re ursiva):pro edure MaxMin4(Linf, Lsup: integer; var Max,Min: integer); var Max1, Max2, Min1, Min2, Meio: integer; begin
if Lsup - Linf
≤
1 then if A[Linf℄<
A[Lsup℄then begin Max := A[Lsup℄; Min := A[Linf℄; end;
else begin Max := A[Linf℄; Min := A[Lsup℄; end
else begin
Meio := (Linf + Lsup) div 2;
MaxMin4(Linf, Meio, Max1, Min1); MaxMin4(Meio+1, Lsup, Max2, Min2); if Max1
>
Max2 then Max := Max1 else Max := Max2;if Min1
<
Min2 then Min := Min1 else Min := Min2;end;
•
Sejaf (n)
a função de omplexidade em n ode omparações entre os elementos de A, se A ontiver