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

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

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

Операции с левосторонними кучами

Операция СЛИЯНИЕ. Эта операция позволяет слить две левосторонние кучи h_1 и h_2 в одну кучу h. Реализуется она посредством слияния правых путей двух исходных куч в один правый путь, упорядоченный по правилам кучи, а левые поддеревья узлов сливаемых правых путей остаются левыми поддеревьями соответствующих узлов в результирующем пути. В полученной куче необходимо восстановить свойство левизны каждого узла. Это свойство может быть нарушено только у узлов правого пути полученной кучи, так как левые поддеревья с корнями в узлах правых путей исходных куч не изменились. Восстанавливается свойство левизны при помощи прохода правого пути снизу вверх (от листа к корню) с попутным транспонированием в случае необходимости левых и правых поддеревьев и вычислением новых рангов проходимых узлов.

Рассмотрим процесс слияния двух левосторонних куч h_1 и h_2, изображенных на рис. 5.2.


Рис. 5.2.

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

После объединения правых путей получим дерево, изображенное на рис. 5.3. Оно не является левосторонним. В скобках указаны ранги узлов, какими они были в исходных кучах до слияния.

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


Рис. 5.3.

Следующий по направлению к корню узел правой ветви имеет ключ 8, ранг его левого сына не меньше ранга правого сына, следовательно, условие левизны выполняется и поэтому транспонирования его левого и правого поддеревьев не требуется. Однако ранг этого узла необходимо обновить, так как его старое значение 1 не совпадает с увеличенным на 1 минимальным из рангов его потомков, то есть с числом 2. Обновив ранг, получим кучу, изображенную на рис. 5.4.


Рис. 5.4.

Теперь рассмотрим узел с ключом 7. Он имеет левого сына с ключом 37 и рангом 1 и правого сына с ключом 8 и рангом 2. Для восстановления свойства левизны в этом узле необходимо поменять местами его левое и правое поддеревья и обновить ранг. Его новым значением будет минимум из рангов его потомков (это ранг нового правого сына) плюс 1, то есть 2. В результате получаем дерево, изображенное на рис. 5.5.


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

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