Sto leggendo un'analisi su array dinamici (dal manuale dell'algoritmo di Skiena).
Cioè quando abbiamo una struttura di array e ogni volta che siamo fuori dallo spazio assegniamo una nuova matrice di dimensioni doppie rispetto all'originale.
Descrive gli sprechi che si verificano quando l'array deve essere ridimensionato.
Dice che (n / 2) da +1 a n verrà spostato al massimo una volta o non lo sarà affatto. Questo è chiaro.
Quindi descrivendo che metà degli elementi si muove una volta, un quarto degli elementi due volte e così via, il
il numero totale di movimenti M è dato da:
Questo mi sembra che aggiunga più copie di quanto realmente avvenga.
per es.
se abbiamo il seguente:
array of 1 element
+--+
|a |
+--+
double the array (2 elements)
+--++--+
|a ||b |
+--++--+
double the array (4 elements)
+--++--++--++--+
|a ||b ||c ||c |
+--++--++--++--+
double the array (8 elements)
+--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x |
+--++--++--++--++--++--++--++--+
double the array (16 elements)
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x || || || || || || || || |
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
Abbiamo l'elemento x copiato 4 volte, l'elemento c copiato 4 volte, l'elemento b copiato 4 volte e un elemento copiato 5 volte quindi il totale è 4 + 4 + 4 + 5 = 17 copie / movimenti.
Ma secondo la formula dovremmo avere 1 * (16/2) + 2 * (16/4) + 3 * (16/8) + 4 * (16/16) = 8 + 8 + 6 + 4 = 26 copie di elementi per l'ingrandimento dell'array a 16 elementi.
Questo è un errore o lo scopo della formula è fornire un'approssimazione approssimativa del limite superiore? O sono incomprensibile qualcosa qui?