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

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

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

Рассмотрим пример выполнения данной операции. Пусть из кучи h, изображенной на рис. 5.8, необходимо удалить элемент x с ключом 9.


Рис. 5.8.

Сначала отрывается подкуча h_2 с корнем x. От h остаются куча h_1 (нелевосторонняя, так как свойству левизны не удовлетворяет узел p ) и левосторонняя куча h_2 (рис. 5.9).


Рис. 5.9.

Затем удаляется узел x, а его левая и правая подкучи h_{2L} и h_{2R} сливаются в одну кучу h'_{2} при помощи описанной выше операции СЛИЯНИЕ; см. рис. 5.10.


Рис. 5.10.

Поскольку узел x не являлся корнем кучи h, операция еще не завершена. Куча h'_{2} становится левым поддеревом узла p, так как узел x был его левым сыном (рис. 5.11).


Рис. 5.11.

Следуем от узла p к корню дерева, для каждого узла этого пути восстанавливаем свойство левизны и ранг. Сначала проверяем узел p: его детей надо поменять местами, так как ранг узла с ключом 10 (он равен 1 ) меньше ранга узла с ключом 5 (он равен 2 ). После этого обновляется ранг узла p: он равен рангу правого сына плюс 1, то есть 2. Получилось дерево, изображенное на рис. 5.12.


Рис. 5.12.

Следующий узел на пути к корню — это родитель узла p с ключом, равным 2. Ранги его сыновей равны, значит менять их местами не нужно. Однако его собственный ранг, возможно, требует обновления, новое значение равно рангу его правого сына плюс 1, т.е. старому: 3. В результате получается дерево, изображенное на рис. 5.13.


Рис. 5.13.

Поскольку узел с ключом 2 является корнем дерева, операция УДАЛЕНИЕ завершена.

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

\formula{
\t{procedure УДАЛЕНИЕ} (h, {\rm
pos});\\
\t begin\\
\mbox{}\q \t if\ {\rm pos} = h\
\t then\ \{
\t{УДАЛЕНИЕ\_МИНИМУМА}\ (h, {\rm xMin});\ {\rm exit}\};\\
\mbox{}\q p := {\rm pos}\t{\^{}}.{\rm parent};\
h2 := {\rm pos};\ \t{УДАЛЕНИЕ\_МИНИМУМА}\ (h2, {\rm xMin});\\
\mbox{}\q \t if\ p\t{\^{}}.{\rm left} =
{\rm pos}\
\t then\ p\t{\^{}}.{\rm left} := h2\
\t else\ p\t{\^{}}.
{\rm right} := h2;\\
\mbox{}\q \t while\ p \ne {\rm nil}\
\t do\\
\mbox{}\q  \t begin\\
\mbox{}\q  \t if\ p\t{\^{}}.{\rm left}
\ne {\rm nil}\ \t then\ r1:=
p\t{\^{}}.{\rm left}\t{\^{}}.{\rm rank}\
\t else\ r1:= 0;\\
\mbox{}\q \t if\ p \t{\^{}}.{\rm right}
\ne {\rm nil}\
\t then\ r2:= p\t{\^{}}.{\rm
right}\t{\^{}}.{\rm rank}\
\t else\ r2:= 0;\\
\mbox{}\qq {\rm newrank} := {\rm min} (r1, r2) + 1;\\
\mbox{}\q  \t if\ r1 < r2\
\t then\ {\rm tr}\ (p\t{\^{}}.
{\rm left},\ p\t{\^{}}.{\rm right});\\
\mbox{}\q  \t if\ {\rm newrank} \ne
p\t{\^{}}.{\rm parent}\t{\^{}}.{\rm
rank}\ \t then\ p\t{\^{}}.{\rm
parent}\t{\^{}}.{\rm rank} := {\rm newrank}\\
\mbox{}\q  \t else\ \t{exit};\\
\mbox{}\q  p:= p\t{\^{}}.{\rm parent};\\
\mbox{}\q  \t end\\
\t end
}

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

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