p2

p2

por José Coelho de Pina -
Número de respostas: 3

Questão. O trecho a seguir foi copiado da documentação da public class ArrayList<E> \ldots do Java https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html:

Each ArrayList instance has a capacity. The capacity is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an , its capacity grows automatically. The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost.

Qual o significado do texto em negrito?

Em uma sequência de operações add() (inserção) o tempo médio de cada operação é constante.

Hmm.
A implementação provavelmente utiliza redimensionamento.
Comentários?

Em resposta à José Coelho de Pina

Re: p2

por Bruno Carneiro da Cunha -

Faz sentido pra mim! sorriso

O redimensionamento roda em tempo linear proporcional ao tamanho do array, mas o custo desse redimensionamento é compensado por um grande número de operações que rodam em tempo constante. Sim

Quanto maior o número de elementos, mais próximo do tempo constante amortizado estaremos?

Em resposta à Bruno Carneiro da Cunha

Re: p2

por José Coelho de Pina -

Oi Bruno,

Quanto maior o número de elementos, mais próximo do tempo constante amortizado estaremos?

Legal você ter perguntado!

O custo amortizado é constante mesmo, não importando o número de operações add().

Considere uma sequência de operações add() em um vetor redimensionável utilizando a política de redimensionamento "encheu, dobre o vetor, copie tudo, segueg o jogo".
Vamos utilizar a metáfora contábil.

Na metáfora contábil cada $1 paga por uma quantidade constante de tempo consumido.
Cada add() tem custo amortizado de não mais do que $3.
De fato. Dê $3 a cada item inserido no vetor.
O item paga $1 ao add() pelo gasto de inseri-lo no vetor e guarda $2 para um possível futuro redimensionamento. Se esse possível redimensionamente ocorrer o item paga $1 pela sua cópia para o novo vetor e paga $1 pela cópia de um item que está na "metade inferior" do vetor e não tem dim-dim $.

A tabela abaixo "comprova" essa argumentação:

  • t representa o tamanho do vetor.
  • custo é o custo real da operação.
  • crédito é quanto o item recebe para pagar a operação.
  • saldo é a soma dos custo até o momento menos o créditos recebidos pelos itens até o momento
  • relação invariante fundamental: saldo >= 0

Da relação fundamental concluímos que o custo por n operações add() é não superior a $3n e portanto o custo médio (amortizado) de cada operação é não superior a $3.

add()tcustocréditosaldo
1 1 1 $3 $2
2 2 1 + 1 $3 $1
3 4 1 + 2 $3 $1
4 4 1 $3 $3
5 8 1 + 4 $3 $2
6 8 1 $3 $4
7 8 1 $3 $6
8 8 1 $3 $8
9 16 1 + 8 $3 $2
10 16 1 $3 $4
11 16 1 $3 $6
... 16 1 $3 $16
17 32 1 + 16 $3 $2
33 64 1 + 32 $3 $2