Você está na página 1de 25

Análise de Algoritmos

Aula 05

Prof. Roberto Leminski


roberto.leminski@docente.unip.br
Conteúdo
•Análise Amortizada
Análise Amortizada
•Considere uma sequência de n
execuções de um algoritmo que atua
sobre uma estrutura de dados.

•Suponha que cada execução do


algoritmo consome um tempo diferente
conforme o estado em que a estrutura
de dados se encontra.
Análise Amortizada
•Em outras palavras, o consumo de
tempo de cada execução depende das
execuções anteriores.

•Tipicamente, cada execução lenta é


precedida por muitas execuções
rápidas.

•A análise amortizada procura fazer


estimativas de consumo de tempo em
situações como esta.
Análise Amortizada
•Neste contexto, é conveniente usar a
palavra operação como sinônimo de
algoritmo.

•Da mesma forma, convém dizer custo


da operação em vez de consumo de
tempo do algoritmo.
Análise Amortizada
•Suponha que uma certa operação
atua sobre uma estrutura de dados E e
modifica a estrutura. Considere agora
uma sequência de n execuções da
operação:

para j := 1 até n faça


Operação (E)
Análise Amortizada
•Cada execução da operação tem um
certo custo, que depende do estado da
estrutura E e portanto das execuções
anteriores da operação.

•Suponha que cada execução cara da


operação é precedida por muitas
execuções baratas.
Análise Amortizada
•Mais precisamente, suponha que
existe um número c tal que a soma dos
custos das m primeiras execuções da
operação não passa de c m.

•Então tudo se passa como se cada


execução tivesse custo ≤ c.

•Dizemos que o custo amortizado de


cada execução do operação não passa
de c.
Análise Amortizada
•O custo amortizado não deve ser
confundido com custo médio.

•O conceito de custo amortizado se


aplica a uma sequência de execuções de
uma operação em que o custo de cada
execução das execuções anteriores.

•Já o custo médio é calculado sobre


um conjunto de execuções
independentes
Exemplo
•Um contador binário é um vetor de
bits A[0 .. k−1]. O contador representa o
número A[0] ⋅ 20 + A[1] ⋅ 21 + ⋯ + A[k−1] ⋅
2k−1.
Exemplo
•A seguinte operação soma 1, em
aritmética mod k, ao contador:

Operação (A)
1 i <- 0
2 enquanto i < k e A[i] = 1
3 A[i] <- 0
4 i := i + 1
5 se i < k
6 A[i] <- 1
Exemplo
•Suponha que o custo da Operação é
igual ao número de alterações de bits,
ou seja, ao número de atribuições A[i] <-
∗ nas linhas 3 e 6.

•Cada execução da Operação altera 1


bit no melhor caso e k bits no pior.
Exemplo
•Agora imagine uma sequência de n
execuções da Operação, começando
com o contador zerado:

1.1 para i <- 0 até k−1


1.2 A[i] :<- 0
1.3 para j <- 1 até n
1.4 Operação (A)
Exemplo
•Qual o custo total da execução das
linhas 1.3 e 1.4?

•No pior caso, cada execução da linha


1.4 produz k alterações de bits e
portanto as n execuções da Operação
têm custo nk no pior caso.

•Essa cota superior é correta mas


exagerada, como veremos a seguir.
Exemplo
•O bit A[0] é alterado em todas as
execuções da Operação.

•O bit A[1] é alterado a cada duas


execuções, ou seja, apenas ⌊n/2⌋ vezes.

•O bit A[2] é alterado apenas ⌊n/22⌋


vezes.
Exemplo
•O bit A[i] é alterado apenas ⌊n/2i⌋
vezes.

•Portanto, o custo total é menor que n


+ n/2 + n/22 + ⋯ + n/2i + ⋯

•Essa soma não passa de 2n.

•Segue daí que o custo amortizado de


cada execução da Operação não passa
de 2.
Análise Amortizada
•É interessante refazer as contas
usando uma metáfora contábil.

•Digamos que cada alteração de um


bit custa uma moeda.

•Antes de cada execução da


Operação, o contador possui um certo
estoque de moedas (acumulado ao
longo das iterações anteriores).
Análise Amortizada
•Para dar início a uma execução da
Operação, é preciso acrescentar duas
moedas ao estoque.

•Durante a execução, as atribuição


nas linhas 3 e 6 consomem parte do
estoque deixando um saldo que, como
veremos, nunca é negativo.
Análise Amortizada
•A ideia é que a primeira das duas
moedas seja usada para custear a
atribuição A[i] <- 1 na linha 6 e a
segunda seja usada futuramente para
custear a atribuição A[i] <- 0 na linha 3.
Análise Amortizada
•Graças a esse protocolo, temos o
seguinte invariante do processo
iterativo: antes de cada execução da
Operação, o número de moedas em
estoque é igual ao número de bits de A
que têm valor 1.
Análise Amortizada
•O invariante mostra que o estoque de
moedas é sempre suficiente para
custear as alterações de bits na linha 3.

•Concluímos assim que a sequência


de n execuções da Operação consome
apenas 2n moedas.
Análise Amortizada
•Podemos dizer, um pouco mais
vagamente, que o custo das n
execuções da Operação é Ο(n).

• Essa conclusão pode ser resumida


dizendo que, no sentido amortizado,
cada execução da Operação na linha 1.4
tem custo Ο(1) , ou seja, um custo que
não depende de k nem de n.
Referências
• DASGUPTA, Sanjoy. Christos Papadimitriou,
Umesh Vazirani. Algoritmos. Porto Alegre, RS:
AMGH, 2011.

• T.H. Cormen, C.E. Leiserson, R.L. Rivest, C.


Stein, Introduction to Algorithms, 2nd
edition, MIT Press & McGraw-Hill, 2001.
Dúvidas ?
Obrigado !

Você também pode gostar