Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1801 / 486 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 5:

Объединяемые приоритетные очереди

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

Далее рассматриваем узел с ключом 6. Оба его сына имеют одинаковый ранг 2, следовательно, менять их местами не требуется. Вычислим лишь новое значение ранга: оно равно минимальному из рангов его детей (рангу правого сына) плюс~ 1, то есть 3. Получаем дерево, изображенное на рис.5.6.


Рис. 5.6.

Наконец, рассматриваем узел с ключом 3, который является последним в правой ветви, полученной слиянием правых ветвей исходных куч. Его потомков (узлы с ключами 10 и 6 ) необходимо поменять местами для восстановления свойства левизны и обновить ранг, который будет теперь равен 3. После выполнения этих операций получим левостороннюю кучу, изображенную на рис.5.7. На этом выполнение операции СЛИЯНИЕ заканчивается.


Рис. 5.7.

Очевидно, время выполнения операции СЛИЯНИЕ пропорционально сумме длин правых путей сливаемых куч. По свойству левосторонней кучи оно не превосходит величины \log n_1 + \log n_2 < \log n +
\log n, где n_1, n_2 — количества узлов в исходных кучах, а n = n_1 + n_2 — количество узлов в результирующей куче. Следовательно, вычислительная сложность операции СЛИЯНИЕ равна O(\log n).

Реализация операции СЛИЯНИЕ

\formula{
\t{procedure СЛИЯНИЕ}(h1,\ h2,\
h);\\
\t begin\\
\mbox{}\q \t if\ h1 = {\rm nil}\
\t then\
\{h := h2;\ \t{exit}\};\\
\mbox{}\q \t if\ h2 = {\rm nil}\
\t then\
\{h := h1;\ \t{exit}\};\\
\mbox{}\q \t if\ h1\t{\^{}}.{\rm key}
> h2\t{\^{}}.{\rm key}\ \t then\
\{h3 := h1;\ h1 :=
h2;\ h2 := h3;\}\\
\mbox{}\q\qq h := h1;\ \t{СЛИЯНИЕ}(h1\t{\^{}}.\ \t{right},\
h2,\ h3);\ h\t{\^{}}.{\rm right}:= h3;\\
\mbox{}\q \t if\ h\t{\^{}}.{\rm
left}\t{\^{}}.{\rm rank} < h\t{\^{}}.{\rm right}\t{\^{}}.{\rm rank}\
\t then\\
\mbox{}\q\qq \{h3:= h\t{\^{}}.{\rm left};\ h\t{\^{}}.{\rm left}
:= h\t{\^{}}.{\rm right};\ h\t{\^{}}.{\rm right} := h3\};\\
\mbox{}\q h\t{\^{}}.{\rm rank} := {\rm min}(h\t{\^{}}.{\rm right}\t{\^{}}.
{\rm rank},\ h\t{\^{}}.{\rm left}\t{\^{}}.{\rm rank}) + 1;\\
\t end;
}

Операция ВСТАВКА. Эта операция позволяет осуществить вставку в кучу h нового элемента x с ключом k. Она производится посредством образования левосторонней кучи, содержащей единственный элемент x с ключом k, и слияния ее с кучей h. Вычислительную сложность данной операции можно оценить так же, как вычислительную сложность операции СЛИЯНИЕ, то есть величиной O(\log n).

Реализация операции ВСТАВКА

\formula{
\t{ procedure
ВСТАВКА}(x,\,k,\,h);\\
\t begin\\
\mbox{}\q {\rm CREATE}\ {\rm node}\ h1:
[\t{element}, \t{key}, \t{rank}, \t{left}, \t{right}, \t{parent}]
= [x, k, l,\\
\mbox{}\q {\rm nil}, {\rm nil}, {\rm nil}];\\
\mbox{}\q \t{СЛИЯНИЕ}(h,\,h1,\,h2);\  h := h2\\
\t end;
}

Операция УДАЛЕНИЕ_МИНИМУМА. Эта операция позволяет из кучи h удалить элемент с минимальным ключом. Она производится посредством удаления корня кучи h (трудоемкость O(1) ), а затем слияния его левой и правой подкуч (трудоемкость O(\log
n) ). Таким образом, вычислительная сложность данной операции является величиной O(\log n).

Реализация операции УДАЛЕНИЕ_МИНИНИМУМА

\formula{
\t{procedure
УДАЛЕНИЕ\_МИНИМУМА} (h, {\rm xMin});\\
\t begin\\
\mbox{}\q {\rm xMin} := h\t{\^{}}.{\rm element};\ \t{СЛИЯНИЕ}\
(h\t{\^{}}.{\rm left},\ h\t{\^{}}.{\rm right},\ h3);\ h :=
h3\\
\t end;
}

Операция МИНИМУМ. Эта операция позволяет взять из кучи h элемент с минимальным ключом, не удаляя его из кучи. Поскольку элемент с минимальным ключом находится в корне кучи, требуется лишь скопировать его в нужное место. Вычислительная сложность данной операции O(1).

Реализация операции МИНИМУМ

\formula{
\t{function МИНИМУМ}\ (h);\\
\t begin\ \t{МИНИМУМ} :=
h\t{\^{}}.{\rm element}\\
\t end;
}

Операция УДАЛЕНИЕ. Эта операция позволяет удалить из кучи h элемент x, расположенный в узле, заданном позицией {\rm pos}. Удаление может быть проведено в несколько этапов.

  1. Если узел x является корнем кучи h, то применяется операция УДАЛЕНИЕ_МИНИМУМА из кучи h. Иначе выполняются следующие действия.
  2. От исходной кучи h отрывается подкуча h_2 с корнем в удаляемом узле x. Оставшаяся куча, для которой сохраняем обозначение h, не обязательно является левосторонней.
  3. Затем узел x удаляется из кучи h_2, а его левая и правая подкучи сливаются в одну кучу h'_{2} (время выполнения — O(\log n), как доказано выше).
  4. Куча h'_{2} делается таким же сыном узла p ( p — родитель узла x ), каким являлся для нее узел x (левым или правым).
  5. Наконец, в куче h восстанавливается свойство левизны. Фактически свойству левизны могут не удовлетворять только узлы, находящиеся на пути от p к корню кучи h. Длина этого пути в худшем случае может линейно зависеть от n. Но на самом деле нам нужно проверить только первые не более чем \lfloor \log (n + 1)\rfloor узлов на этом пути (потому что максимальный по длине правый путь имеет максимум \lfloor \log (n + 1)\rfloor узлов).

Таким образом, время выполнения операцииO(\log n).

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Антон Сиротинкин
Антон Сиротинкин

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