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

Приоритетные очереди

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

Операции с d-кучей

При реализации основных операций над кучами используются две вспомогательные операции — ВСПЛЫТИЕ и ПОГРУЖЕНИЕ. При реализации этих операций введем еще одну вспомогательную операцию — транспонирование, с помощью которой будем менять местами элементы, расположенные в двух разных узлах дерева. Ее реализация может быть представлена следующим образом:

\formula{
\t{procedure}\ tr(i, j);\\
\t begin\\
\mbox{}\q {\rm temp}0:= a[i]; a[i]:= a[j];\ a[j]:= {\rm temp}0; \\
\mbox{}\q {\rm temp}1:= {\rm key}[i];\
{\rm key}[i]:= {\rm key}[j];\ {\rm key}[j]:= {\rm temp}1;\\
\t end;
}

Замечание. Если в кучу помещаются только ключи элементов, то процедура транспонирования модифицируется соответствующим образом.

Операция ВСПЛЫТИЕ.Эта операция применяется в тех случаях, когда в некотором узле, например в i -м, расположен элемент x, нарушающий кучеобразный порядок так, что его ключ меньше ключа его родителя y.

Элементы x и y меняются местами. Если после этого элемент x снова не удовлетворяет условиям кучи, то еще раз проводится аналогичная перестановка. И так до тех пор, пока x не встанет на свое место.

Рассмотрим 3-дерево на рис. 4.3. В этом дереве кучеобразный порядок нарушает узел 17 с ключом 14, так как его родительскому узлу приписан элемент с ключом 31 > 14.


Рис. 4.3.

Применим к узлу 17 операцию ВСПЛЫТИЕ. Элементы с ключами 31 и 14 меняются местами. В результате получается дерево, представленное на рис. 4.4.


Рис. 4.4.

Теперь нарушен кучеобразный порядок в узле 5 ( 21 >
14 ), меняем местами элементы c ключами 21 и 14. В результате получаем кучу, изображенную на рис. 4.5. Кучеобразный порядок восстановлен, операция ВСПЛЫТИЕ завершена.


Рис. 4.5.

Вычислительная сложность этой операции пропорциональна числу сравнений элементов и их обменов. Это число, очевидно, не более чем удвоенное число узлов в пути от узла x до корня дерева. Длина такого пути в d -куче с n узлами не превосходит ее высоты, а именно \log_d n + 1, в соответствии с доказанным выше утверждением 1. Значит, время выполнения данной операцииO(\log_d n).

Реализация операции ВСПЛЫТИЕ. Входным параметром этой операции является номер узла, в котором нарушен порядок:

\formula{
\t{procedure ВСПЛЫТИЕ}(i);\\
\t{begin}\\
p:= (i - 1)\ \t div\ d;\\
\mbox{}\q\t while (i \ne 0)\
\t and\ ({\rm key}[p] > {\rm
key}[i])\ \t do\ \{{\rm tr}(i, p);\ i:=
p;\ p:= (i - 1)\
\t div\ d\};\\
\t end;
}

Замечание.

  1. Операцию ВСПЛЫТИЕ можно применять не только к d -куче, но и к другим видам куч.
  2. Для более эффективного выполнения операции ВСПЛЫТИЕ можно поступить следующим образом: запомнить элемент, находящийся в узле i, переместить элемент из его родительского узла p = (i - 1) \mathop{\rm
div}\nolimits d в узел i, затем из узла (p - 1) \mathop{\rm div}\nolimits
d в узел p и так до тех пор, пока не освободится узел для запомненного элемента. После этого поместить запомненный элемент на освободившееся место. Более точно это можно выразить с помощью следующих операторов:
\formula{
\t begin {\rm key}0:= {\rm key}[i];\
a0:= a[i];\ p:= (i - 1)
\t div\ d; \\
\mbox{}\q \t while\ (i \ne 0)\
\t and\ ({\rm key}[p] > {\rm key}0\
\t do\\
\mbox{}\q\qq \{a[i]:=a[p];\ {\rm key}[i]:= {\rm key}[p];\
i:= p;\ p:= (i - 1)\ \t div\ d\};\\
\mbox{}\q a[i]:= a0;\ {\rm key}[i]:= {\rm key}0\\
\t end;
}

Операция ПОГРУЖЕНИЕ. Эта операция также применяется для восстановления свойства кучеобразности. Пусть, например, в i -м узле расположен элемент x, нарушающий кучеобразный порядок таким образом, что ключ элемента x больше ключа элемента y, приписанного потомку узла i. В этом случае среди непосредственных потомков узла i выбирается элемент y с наименьшим ключом, и элементы x и y меняются местами. Если после этого элемент x снова не удовлетворяет условиям кучи, то еще раз проводим аналогичную перестановку. И так до тех пор, пока x не встанет на свое место.

Рассмотрим 3 -дерево, представленное на рис. 4.6. В узле 1 расположен элемент x с ключом 31, и этот узел имеет двух потомков с меньшими ключами, а именно 30 и 14. Применим к элементу x операцию ПОГРУЖЕНИЕ.


Рис. 4.6.
< Лекция 3 || Лекция 4: 123456 || Лекция 5 >
Антон Сиротинкин
Антон Сиротинкин

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