Estoy leyendo un análisis sobre matrices dinámicas (del manual de algoritmos de Skiena).
Es decir, cuando tenemos una estructura de matriz y cada vez que nos quedamos sin espacio, asignamos una nueva matriz del doble del tamaño del original.
Describe el desperdicio que ocurre cuando la matriz tiene que ser redimensionada.
Dice que (n / 2) +1 a n se moverán como máximo una vez o no se moverán. Esto esta claro.
Luego, al describir que la mitad de los elementos se mueven una vez, una cuarta parte de los elementos dos veces, y así sucesivamente, el número total de movimientos M viene dado por:
Esto me parece que agrega más copias de las que realmente suceden.
P.ej
si tenemos lo siguiente:
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 || || || || || || || || |
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
Tenemos el elemento x copiado 4 veces, el elemento c copiado 4 veces, el elemento b copiado 4 veces y un elemento copiado 5 veces, por lo que el total es 4 + 4 + 4 + 5 = 17 copias / movimientos.
Pero de acuerdo con la fórmula, deberíamos tener 1 * (16/2) + 2 * (16/4) + 3 * (16/8) + 4 * (16/16) = 8 + 8 + 6 + 4 = 26 copias de elementos para la ampliación de la matriz a 16 elementos.
¿Es esto un error o el objetivo de la fórmula es proporcionar una aproximación aproximada del límite superior? ¿O estoy entendiendo mal algo aquí?
b
se copia 3 veces, cada c
dos veces y cada x
una. 15 ejemplares.