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

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

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

Наконец, сливаем кучи h и h_2, получая в результате левостороннюю кучу (рис. 5.19).


Рис. 5.19.

Реализация операции УМЕНЬШИТЬ_КЛЮЧ

\formula{
\t{procedure УМЕНЬШИТЬ\_КЛЮЧ}
(h, {\rm pos}, {\rm delta});\\
\t begin\\
\mbox{}\q {\rm pos}\t{\^{}}.{\rm key} := {\rm pos}\t{\^{}}.{\rm key} -
{\rm delta};\ \t if\ {\rm pos} = h\
\t then\ {\rm exit};\\
\mbox{}\q  p := {\rm pos}\t{\^{}}.{\rm parent};\ h2 := {\rm pos};\\
\mbox{}\q  \t if\ p\t{\^{}}.{\rm left}
= {\rm pos}\
\t then\ p\t{\^{}}.{\rm left} := {\rm
nil}\ \t else\
\t if\ p\t{\^{}}.{\rm right} = {\rm
pos}\ \t then\\
\mbox{}\q\qq p\t{\^{}}.{\rm right} := {\rm nil};\\
\mbox{}\q  \t while\ p \ne {\rm
nil}\ \t do\\
\mbox{}\q  \t begin\\
\mbox{}\q\qq \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\qq \t if\ p\t{\^{}}.{\rm
right} \ne {\rm nil}\
\t then\ r2 := p\t{\^{}}.{\rm
right}\t{\^{}}.{\rm rank}\
\t else\ r2 := 0;\\
\mbox{}\q\qq {\rm newrank} := {\rm min} (r1, r2 ) + 1;\\
\mbox{}\q\qq \t if\ r1 < r2\
\t then\ {\rm tr}
(p\t{\^{}}.{\rm left},\ p\t{\^{}}.{\rm right});\\
\mbox{}\q\qq \t if\ {\rm newrank} \ne
p\t{\^{}}.{\rm parent}\t{\^{}}.
{\rm rank}\ \t then\\
\mbox{}\q\qq\qq p\t{\^{}}.{\rm parent}\t{\^{}}.{\rm rank} :=
{\rm newrank}\ \t else\ {\rm exit};\\
\mbox{}\q\qq p := p\t{\^{}}.{\rm parent}\\
\mbox{}\q \t end;\\
\mbox{}\q \t{СЛИЯНИЕ}\ (h,\,h2,\,h);\\
\t end;
}

Операция ОБРАЗОВАТЬ_ОЧЕРЕДЬ. Из элементов списка S{(|S| = n)} образуется левосторонняя куча h. Способ формирования такой кучи посредством n применений операции ВСТАВИТЬ неэффективен. Читателю предоставляется возможность доказать, что в худшем случае формирование кучи таким способом может потребовать c\cdot n\cdot \log
n операций, где c = \const.

Более эффективным является следующий способ образования n -элементной левосторонней кучи. Заводится список Q, в который помещаются n одноэлементных куч. Пока длина списка Q больше 1, из его начала извлекаются две кучи, производится их слияние, а полученная куча вставляется в конец списка Q.

Читателю предоставляется возможность доказать, что время выполнения операции ОБРАЗОВАТЬ_ОЧЕРЕДЬ таким способом — O(n).

Реализация операции ОБРАЗОВАТЬ_ОЧЕРЕДЬ

\formula{
\t{procedure
ОБРАЗОВАТЬ\_ОЧЕРЕДЬ}\ (S, h);\\
\t begin\\
\mbox{}\q \t{Создать список Q из одноэлементных куч,
содержащих элементы}\\
\mbox{}\q \t{списка}\ S;\\
\mbox{}\q \t while\ |Q| > 1\
\t do\\
\mbox{}\q \t begin\\
\mbox{}\q\qq \t{Из начала списка}\ Q\ \t{изъять две кучи}\ h1, h2;\\
\mbox{}\q\qq \t{Создать кучу}\ h,\ \t{объединяя кучи}\ h1, h2;\\
\mbox{}\q\qq \t{Поместить кучу}\ h\ \t{в конец списка}\ Q\\
\mbox{}\q \t end\\
\t end;
}

Сводные данные о трудоемкости операций с левосторонними кучами

СЛИТЬ (h1, h2, h) O(\log n)
ВСТАВИТЬ (x, h) O(\log n)
УДАЛИТЬ_МИН (h, x) O(\log n)
МИН (x, h) O(1)
УДАЛИТЬ (x, h) O(\log n)
УМЕНЬШИТЬ_КЛЮЧ (x, D, h) O(\log n)
ОБРАЗОВАТЬ_ОЧЕРЕДЬ (q, h) O(n)
< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Антон Сиротинкин
Антон Сиротинкин

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