2013-07-04 2 views
4

Динамический массив - это массив, удваивающий его размер, когда элемент добавляется в уже полный массив, копируя существующие элементы в новое место 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 это правильная формула).

Кто прав, а что нет в другом аргументе?

ответ

3

Обе версии: O (n), поэтому нет большой разницы.

Версия учебника подсчитывает начальную запись каждого элемента в качестве операции перемещения, но не учитывает самый первый элемент, который будет перемещаться ceil(log(n)) раз. Кроме этого они эквивалентны, т.е.

(sum for {i=1} to {ceil(log(n))} of i*n/{2^i}) - (n - 1) + ceil(log(n)) 
    == sum for {i=1} to {ceil(log(n))} of n/{2^i} 

когда n является степенью 2. Оба выключены разными суммами, когда n не силы 2.

+0

Спасибо @tom. Да, ясно, что сложность для обоих - O (n). Формула кажется правильной, но не могли бы вы объяснить, почему первый элемент не рассматривается в версии учебника (в этой формуле я перехожу к «ceil (log (n))», который является точным первым элементом) ... –

+0

@ Андрей «половина + четверть + восьмая + ...», например 8 равно 4 + 2 + 1 = 7, оставляя последний элемент. – tom

+0

Я вижу это так, @Tom для вашего примера (учебник) 8: 1 * 8/2 + 2 * 8/4 + 3 * 8/8 = 4 + 4 + 3. Конечно, последние 3 - это число раз копируется первый блок (первый элемент). –

Смежные вопросы