Estou lendo uma análise sobre matrizes dinâmicas (do manual do algoritmo do Skiena).
Ou seja, quando temos uma estrutura de matriz e cada vez que estamos sem espaço, alocamos uma nova matriz com o dobro do tamanho do original.
Ele descreve o desperdício que ocorre quando a matriz precisa ser redimensionada.
Diz que (n / 2) +1 a n será movido no máximo uma vez ou não será. Isto está claro.
Em seguida, descrevendo que metade dos elementos se move uma vez, um quarto dos elementos duas vezes e assim por diante, o número total de movimentos M é dado por:
Parece-me que adiciona mais cópias do que realmente acontece.
Por exemplo
se tivermos o seguinte:
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 || || || || || || || || |
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
Temos o elemento x copiado 4 vezes, o elemento c copiado 4 vezes, o elemento b copiado 4 vezes e um elemento copiado 5 vezes, de modo que o total é 4 + 4 + 4 + 5 = 17 cópias / movimentos.
Mas, de acordo com a fórmula, deveríamos ter 1 * (16/2) + 2 * (16/4) + 3 * (16/8) + 4 * (16/16) = 8 + 8 + 6 + 4 = 26 cópias de elementos para a ampliação da matriz para 16 elementos.
Isso é algum erro ou o objetivo da fórmula é fornecer uma aproximação aproximada do limite superior? Ou estou entendendo algo errado aqui?
b
é copiado 3 vezes, cada c
duas vezes e uma x
vez. 15 cópias.