на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Объединяемые приоритетные очереди
Наконец, сливаем кучи и
, получая в
результате левостороннюю кучу (рис. 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;
}](/sites/default/files/tex_cache/e23b75d6c1389d63b0196442ea4ad36a.png)
Операция ОБРАЗОВАТЬ_ОЧЕРЕДЬ.
Из элементов списка образуется
левосторонняя куча
. Способ формирования такой кучи
посредством
применений операции ВСТАВИТЬ неэффективен.
Читателю предоставляется возможность доказать, что в худшем случае
формирование кучи таким способом может потребовать
операций, где
.
Более эффективным является следующий способ образования -элементной левосторонней кучи. Заводится список
, в который
помещаются
одноэлементных куч. Пока длина списка
больше 1, из его начала
извлекаются две кучи, производится их слияние, а полученная куча
вставляется в конец списка
.
Читателю предоставляется возможность доказать, что время выполнения
операции ОБРАЗОВАТЬ_ОЧЕРЕДЬ таким способом — .
Реализация операции ОБРАЗОВАТЬ_ОЧЕРЕДЬ
![\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;
}](/sites/default/files/tex_cache/8fbe92b1501aa86ab42ceb89e02b516e.png)