на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Приоритетные очереди
Операция УМЕНЬШЕНИЕ_КЛЮЧА. Предназначена для уменьшения ключа
у элемента, приписанного узлу с заданным номером , на заданную
величину
. Это действие может нарушить кучеобразный порядок
лишь таким образом, что уменьшенный ключ элемента в узле
станет меньше
ключа элемента в родительском узле. Для восстановления порядка в куче
используется операция ВСПЛЫТИЕ.
Вычислительная сложность данной операции определяется временем,
затрачиваемым на уменьшение ключа (то есть константой), и временем
выполнения операции ВСПЛЫТИЕ (то есть .
В итоге вычислительная сложность операции УМЕНЬШИТЬ_КЛЮЧ
равна
.
Реализация операции УМЕНЬШЕНИЕ_КЛЮЧА
![\formula{
\t{procedure УМЕНЬШИТЬ\_КЛЮЧ}\
(i, delta);\\
\t begin\ {\rm key}[{i}] := {\rm
key}[{i}] - {delta};\
\t{ВСПЛЫТИЕ}\ (i);\ \t end;
}](/sites/default/files/tex_cache/f102534d9c7f52d1c09bfd98c72314be.png)
Операция ОКУЧИВАНИЕ.
Заметим, что если -куча создается путем
-кратного применения операции ВСТАВКА, то суммарная трудоемкость
ее создания будет равна
. Если же
все
элементов сначала занимают в произвольном порядке массив
и, соответственно, массив
,
то можно превратить их в
-кучу, применяя операцию ПОГРУЖЕНИЕ
по очереди к узлам
.
Такой процесс будем называть окучиванием массива. Для доказательства того,
что в результате действительно устанавливается кучеобразный порядок,
достаточно заметить, что если поддеревья с корнями в узлах упорядочены по правилу кучи, то
после применения процедуры ПОГРУЖЕНИЕ к узлу
поддерево с корнем в этом
узле также станет упорядоченным по правилу кучи. Итак, остановимся на
следующей реализации.
Реализация операции ОКУЧИВАНИЕ

Утверждение 3.
Вычислительная сложность операции
ОКУЧИВАНИЕ равна .
Доказательство
Заметим, что трудоемкость погружения с высоты
равна
, а количество узлов высоты
не превосходит
. Осталось оценить сумму



Для суммирования можно воспользоваться формулой

Предоставляем читателю возможность завершить доказательство.
Операция СОЗДАТЬ_СПИСОК_МИНИМАЛЬНЫХ.
Эта операция применяется для получения списка элементов,
которые имеют ключи, меньшие заданного
значения , и реализуется следующим образом. Если ключ
элемента, находящегося в корне, больше, чем
, то это дерево не
имеет искомых элементов. В противном случае включаем его
в выходной список
, а затем применяем ту же процедуру ко всем
потомкам узла, включенного в список.
Пусть куча содержит элементов с ключами, меньшими, чем
.
По свойству кучи, они все расположены на ее "верхушке". Данная
процедура обходит эту верхушку за время, пропорциональное
, и для каждого
из этих
элементов просматривает все его
(или меньше)
непосредственных потомков. Получаем, что время выполнения данной процедуры
является величиной
.
Реализация операции СОЗДАТЬ_СПИСОК_МИНИМАЛЬНЫХ
![\formula{
\t{procedure
СОЗДАТЬ\_СПИСОК\_МИНИМАЛЬНЫХ}(S, {\rm key}0);\\
\t begin\\
\mbox{}\q \t{Инициализируем пустой список} S; \\
\mbox{}\q \t{Инициализируем стек};\\
\mbox{}\q 0 \Rightarrow \t{стек};\\
\mbox{}\q \t{ while стек не пуст
do}\\
\mbox{}\q\qq \t{begin стек}
\Rightarrow i;\\
\mbox{}\q\qq\qq if ({\rm key}[i] <
{\rm key}0)\
\t{then Добавить} a[i]\ \t{к
списку}\ S;\\
\mbox{}\q\qq\qq \t for\ j:=d^\ast i +
1\ \t to\
d^\ast(i + 1)\ \t do if\ j \le (n -
1)\ \t then\
j \Rightarrow \t{стек};\\
\mbox{}\q\qq \t end\\
\t end
}](/sites/default/files/tex_cache/6c55ecfb6d8a8676c805eeb4c072899e.png)
Сводные данные о трудоемкости операций с d-кучами
ВСПЛЫТИЕ ![]() |
![]() |
ПОГРУЖЕНИЕ ![]() |
![]() |
ВСТАВКА ![]() |
![]() |
УДАЛЕНИЕ ![]() |
![]() |
УДАЛЕНИЕ_МИН ![]() |
![]() |
MINKEY | ![]() |
УМЕНЬШЕНИЕ_КЛЮЧА ![]() |
![]() |
ОБРАЗОВАTЬ_ОЧЕРЕДЬ | ![]() |
СПИСОК_МИН ![]() |
![]() |
Замечание.
Для -куч "неудобной" является операция
слияния куч.
Применение приоритетных очередей в задаче сортировки
Под задачей сортировки в простейшем случае понимают следующее: дана
последовательность
из
элементов некоторого линейно упорядоченного множества,
например целых или вещественных чисел, записанных в массив
.
Требуется переставить элементы массива так, чтобы после перестановки выполнялись
неравенства:
![\eq*{
{\rm key}[1] \le {\rm key}[2] \le \ldots \le {\rm key} [n].
}](/sites/default/files/tex_cache/6421930a8fc121a04bf8b804c413b417.png)
Уточнения этой задачи связаны с теми средствами, с помощью которых
предполагается ее решение. Нас интересуют алгоритмы с точки зрения их
компьютерной реализации. Оценивая качество различных алгоритмов, обычно
интересуются тем, как зависит время счета от длины сортируемой
последовательности и требуется ли для этого дополнительная память, размер
которой определяется параметром
. Существенную роль при этом
играет метод доступа к элементам памяти. При сортировке во внутренней
(оперативной) памяти обычно используется прямой доступ, а во внешней —
последовательный.