Appunti lezione – Capitolo 4
Strutture di dati elementari
Alberto Montresor
19 Agosto, 2014
1
Domanda: espansione di un array, meglio aumentare o raddoppiare
Doubling In the first version, the initial size is 1 and the array is doubled whenever there is no free space
left. Let’s suppose to insert n elements to the array, and let ci be the cost of the i-th insertion:
i if ∃k : i = 2k + 1
ci =
1 otherwise
In other words, the cost is normally 1; but an insertion executed immediately after an insertion that has
exhausted the array (i.e. when the current size of the array is an exact power of 2) costs i, because we have
to copy the array in the new one.
Let’s consider the total cost of the n insertion:
C(n)
=
n
X
ci
i=1
blog2 nc
≤
n+
X
2j
j=0
Note that the first component (n) is given by the n “pure” insertions, while the second is given by the cost of
doubling. Simplifying the expression we get:
C(n) ≤ n + 2blog2 nc+1 − 1
≤ n + 2n
So the total cost for n insertions is bounded by 3n, which means that the amortized cost for each insertion is
constant.
Constant increment In this version, the array size is incremented by a constant amount d whenever the
space is exhausted. This means that:
i if i = 1 mod d
ci =
1 otherwise
1
Computing the total cost:
C(n)
=
n
X
ci
i=1
bn/dc
≤
n+
X
d·j
j=1
bn/dc
=
n+d
X
j
j=1
=
≤
=
(bn/dc + 1)bn/dc
2
(n/d + 1)n
n+
2
O(n2 )
n+d
This means that the total cost is O(n2 ), while the amortized cost for each insertion is O(n).
1.1
Conclusions
The ArrayList documentation says:
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 ArrayList, 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.
This means that ArrayList grows exponentially (note that growing factors different from 2 corresponds
to constant amortized time cost, but with different multiplicative constants).
2
Domanda: Rimozione di un elemento da una sequenza realizzata
tramite vettore
La rimozione deve essere effettuata in tempo O(n), in quanto tutti gli elementi successivi all’elemento
rimosso devono essere spostati di una posizione nell’array.
3
Domanda: Rimozione di un elemento da un array non ordinato
La rimozione può essere effettuata in tempo O(1): basta scambiare l’elemento da rimuovere con l’ultimo
elemento dell’array e far arretrare l’indice che punta all’ultimo elemento dell’array.
4
Domanda: Scelta fattore carico
1
2
per le rimozioni
Supponiamo di avere un tabella di dimensione n + 1 = 2k + 1 inserimenti; questo causa k espansioni; poi
di alternare le operazioni di inserimento I e di cancellazione C in quest’ordine:
C, C, I, I, C, C, . . .
Ogni due cancellazioni ed ogni due inserimenti assistiamo ad una contrazione ed ad un’espansione, ognuna
delle quale costa n. Il costo ammortizzato totale è O(n).
2
Scarica

Appunti lezione – Capitolo 4 Strutture di dati elementari