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

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

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Ключевые слова: Левосторонняя куча, представление, левостороннее бинарное дерево, бинарное дерево, корневое дерево, листья, Ранг узла, расстояние, дерево, ранг, минимум, ранг вершины, Левостороннее дерево, Ветвь бинарного дерева, Правая ветвью дерева, ветвь, element, key, rank, left, right, parent, УДАЛИТЬ, УМЕНЬШИТЬ_КЛЮЧ, Операция СЛИЯНИЕ, путь, ПО, ключ, значение, операции, время выполнения операции, Реализация операции СЛИЯНИЕ, Операция ВСТАВКА, Реализация операции ВСТАВКА, Операция УДАЛЕНИЕ_МИНИМУМА, Реализация операции УДАЛЕНИЕ_МИНИНИМУМА, Операция МИНИМУМ, место, Реализация операции МИНИМУМ, Операция УДАЛЕНИЕ, куча, корнем дерева, Реализация операции УДАЛЕНИЕ, Операция УМЕНЬШИТЬ_КЛЮЧ, уменьшение ключа, длина, время выполнения, Реализация операции УМЕНЬШИТЬ_КЛЮЧ, Операция ОБРАЗОВАТЬ_ОЧЕРЕДЬ, список, Реализация операции ОБРАЗОВАТЬ_ОЧЕРЕДЬ

Левосторонние кучи

Левосторонняя куча — это представление приоритетной очереди с помощью так называемого левостороннего бинарного дерева. При реализации приоритетных очередей левосторонними кучами предусматривается возможность их объединения.

Бинарным деревом называется корневое дерево, у которого каждый узел имеет не более двух непосредственных потомков. Один из потомков называется левым, другой, если он есть, — правым. Узел называется неполным, если он имеет менее двух непосредственных потомков. В частности, листья дерева являются неполными узлами.

Рангом узла будем называть увеличенное на 1 расстояние (число ребер) от него до ближайшего неполного потомка.

Ранг узла также можно определить следующим образом. Расширить данное дерево до полного бинарного дерева, добавляя к каждому узлу, имеющему менее двух потомков, в том числе и к листьям исходного дерева, недостающее количество потомков. Затем приписать каждому из листьев полученного расширенного дерева ранг 0, а ранг каждого из остальных узлов определить как минимум из рангов его непосредственных потомков плюс 1. Очевидно, что ранги вершин исходного дерева совпадут с рангами соответствующих вершин расширенного дерева.

Левостороннее дерево — это бинарное дерево, для каждого узла которого ранг его левого непосредственного потомка в расширенном дереве не меньше ранга его правого потомка.

Ветвью бинарного дерева мы называем последовательность его узлов, начинающуюся с корня и заканчивающуюся листом, такую, что каждый следующий узел является непосредственным потомком предыдущего.

Правой ветвью дерева мы называем ветвь, заканчивающуюся в узле, не имеющем правого потомка, такую, что каждый следующий узел является непосредственным правым потомком предыдущего.

Пример левостороннего дерева (и его расширения) приведен на рис. 5.1. Ребра исходного дерева выделены жирными линиями, а ребра, добавленные при расширении, — пунктиром. Числа рядом с узлами — их ранги.


Рис. 5.1.

Свойства левостороннего дерева

  1. Правая ветвь из любого узла дерева имеет минимальную длину среди всех ветвей, исходящих из этого узла.
  2. Длина правой ветви левостороннего дерева, имеющего n узлов, ограничена величиной c \lfloor \log_2 n\rfloor, c =
\const.

Первое свойство непосредственно следует из определения левостороннего дерева. Для доказательства второго свойства рассмотрим левостороннее дерево T, у которого длина правой ветви равна h. Индукцией по числу h докажем, что число n узлов в таком дереве удовлетворяет неравенству n \ge 2^h - 1. Действительно, при h= 1 утверждение очевидно. При h > 1 левое и правое поддеревья дерева T будут левосторонними, а ранги их корней больше или равны h - 1. Следовательно, по предположению индукции число узлов в каждом из них больше или равно 2^{h - 1} - 1, а в дереве T — больше или равно

\eq*{
(2^{h - 1} - 1) + (2^{h - 1} - 1) + 1 = 2^h - 1.
}

Для реализации приоритетной очереди с помощью левосторонней кучи будем использовать узлы вида

\eq*{
{\rm Node} = (\t element,
\t key, \t rank,
\t left, \t right, \t parent),
}
содержащие следующую информацию:

  • element — элемент приоритетной очереди или ссылка на него (используется прикладной программой);
  • key — его ключ (вес);
  • rankранг узла, которому приписан рассматриваемый элемент;
  • left, right — указатели на левое и правое поддеревья;
  • parent — указатель на родителя.

Куча представляется указателем на ее корень. Если h — указатель на корень кучи, то через h будем обозначать и саму кучу. Заметим, что указатель на родителя используется лишь в операциях УДАЛИТЬ и УМЕНЬШИТЬ_КЛЮЧ (см. ниже).

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

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