Опубликован: 26.09.2006 | Уровень: специалист | Доступ: платный
Лекция 6:

Ленивые левосторонние и самоорганизующиеся кучи

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

Утверждение. Время T выполнения m операций СЛИТЬ, примененных к коллекции, состоящей из (m + 1) куч с нулевым потенциалом, является величиной O(m \log n), где n — общее количество узлов в коллекции.

Доказательство. Пусть i -я операция заключается в слиянии куч h_1 и h_2 в результирующую кучу h. Пусть перед ее выполнением H_1 и H_2 — количества тяжелых узлов в правых путях куч h_1 и h_2 соответственно, L_1 и L_2 — количества легких узлов в этих путях, Q_1, Q_2 — количества тяжелых узлов в остальных частях куч.

Время выполнения этой операции с точностью до постоянного множителя оценивается сверху величиной C_i = (H_1 + L_1) +
(H_2 + L_2).

Подсчитаем изменение \Dl P_i потенциала при ее выполнении. Имеем

\eq*{
P_{i-1} = H_1 + Q_1 + H_2 + Q_2.
}

По завершении этой операции тяжелые узлы правых путей становятся легкими, их количество равно H_1 + H_2. Легкие узлы правых путей могут как стать тяжелыми, так и остаться легкими, их будет не более L_1 + L_2 штук, а количества тяжелых узлов в остальной части обоих деревьев Q_1 + Q_2 не изменились. Следовательно, количество P_i тяжелых узлов после выполнения операции удовлетворяет неравенству

\eq*{
P_i \le L_1 + Q_1 + L_2 + Q_2.
}

Таким образом, получаем изменение потенциала

\Dl P_i = P_i - P_{i - 1} \le (L_1 + Q_1 + L_2 + Q_2) -
 (H_1 + Q_1 + H_2 + Q_2)  = L_1 + L_2 - H_1 - H_2

и, следовательно,

\eq*{
C_i + \Dl P_i \le (H_1 + L_1 + H_2 + L_2) + (L_1 + L_2 - H_1 -
H_2) = 2(L_1 + L_2).
}

Из определения легкого узла следует, что количество L_i легких узлов в куче h_i (i = 1, 2) не превосходит логарифма количества n_i узлов в этой куче.

Следовательно,

\eq*{
C_i+ \Dl P_i \le 2(L_1 + L_2) \le 2(\log n_1 + \log n_2) \le 2\log n_{12} \le
2\log n,
}
где n_{12} = n_1 + n_2, а n — общее количество узлов в исходных m кучах.

Суммируя левую и правую части последнего неравенства по i = 1, 2\dts m, получаем, что величина T с точностью до постоянного множителя оценивается сверху величиной, пропорциональной 2m \log n, то есть принадлежит O(m \log n).

Величина 2\log n является амортизационной оценкой времени выполнения операции СЛИТЬ, то есть величиной O(\log n).

Замечание. Вначале коллекция, состоящая из m + 1 куч, к которым применяются m операций СЛИТЬ, может иметь произвольное количество узлов, в сумме равное n. Важно, чтобы потенциал каждой из них, следовательно, и суммарный потенциал был равен нулю, то есть кучи не должны первоначально иметь тяжелых узлов.

Это могут быть, например, кучи, целиком являющиеся левыми путями. Крайний случай — это куча высоты h с минимальным количеством узлов, не имеющая тяжелых узлов, а также это могут быть кучи с заполненным последним уровнем узлов. Другой крайний случай — это куча высоты h с максимальным количеством узлов, не имеющая тяжелых узлов. Остальные варианты являются промежуточными.

Особое значение имеет случай, когда каждая из m + 1 начальных куч состоит из единственного узла.

Итак, для всех коллекций таких куч амортизационное время выполнения одной операции СЛИТЬ является величиной O(\log n), где n — общее количество их узлов.

Сводные данные о трудоемкости операций с самоорганизующимися кучами

Операция Верхняя оценка Амортизационная оценка
СЛИТЬ O(n) O(\log n)
ВСТАВИТЬ O(n) O(\log n)
УДАЛИТЬ_МИНИМУМ O(n) O(\log n)
НАЙТИ_МИНИМУМ O(1) O(1)
< Лекция 5 || Лекция 6: 123 || Лекция 7 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...
 

Дмитрий Степаненко
Дмитрий Степаненко
Россия
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ