Динамический массив - это массив, удваивающий его размер, когда элемент добавляется в уже полный массив, копируя существующие элементы в новое место more details here. Понятно, что операции массового копирования будут ceil(log(n))
.Число перемещений в динамическом массиве
В учебнике я видел, количество движений M
, как вычисляемый таким образом:
M=sum for {i=1} to {ceil(log(n))} of i*n/{2^i}
с аргументом, что «половина элементов двигаются раз, четверть из элементов дважды» ...
Но я думал, что для каждой операции массового копирования количества копируемых/перемещаемых элементы фактически n/2^i
, поскольку каждая массовая операция инициируются при достижении и превышения 2^i th
элемента, так что количество движений
M=sum for {i=1} to {ceil(log(n))} of n/{2^i}
(для n = 8 это правильная формула).
Кто прав, а что нет в другом аргументе?
Спасибо @tom. Да, ясно, что сложность для обоих - O (n). Формула кажется правильной, но не могли бы вы объяснить, почему первый элемент не рассматривается в версии учебника (в этой формуле я перехожу к «ceil (log (n))», который является точным первым элементом) ... –
@ Андрей «половина + четверть + восьмая + ...», например 8 равно 4 + 2 + 1 = 7, оставляя последний элемент. – tom
Я вижу это так, @Tom для вашего примера (учебник) 8: 1 * 8/2 + 2 * 8/4 + 3 * 8/8 = 4 + 4 + 3. Конечно, последние 3 - это число раз копируется первый блок (первый элемент). –