на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Приоритетные очереди
Среди непосредственных потомков узла 1 находим узел, которому приписан
элемент с наименьшим ключом, в нашем случае это
узел
c ключом
. Меняем местами элементы
и
.
В результате получается дерево, изображенное на рис. 4.7.
Теперь элемент снова имеет потомка с меньшим, чем у него,
ключом (а точнее, оба его потомка имеют меньшие ключи). Снова находим
непосредственного потомка элемента
с наименьшим ключом, и меняем
его и
местами. Получается дерево, изображенное на рис. 4.8.
Теперь находится в узле 17 и не имеет потомков с меньшим, чем
у него, ключом (точнее, у него вообще нет потомков). Операция ПОГРУЖЕНИЕ
завершена.
Вычислительная сложность этой операции пропорциональна числу сравнений
элементов и их обменов. Для каждого узла в пути следования данной операции
производится сравнений (при поиске потомка с минимальным
ключом) и один обмен. Длина этого пути в
-куче с
узлами не
превосходит ее высоты, а именно
, по доказанному выше
утверждению 1. Значит, время выполнения данной
операции —
.
Для реализации операции погружения воспользуемся функцией
, позволяющей для любого
узла
находить его непосредственного
потомка с минимальным ключом. Если у узла
нет потомков,
то
.
Реализация операции ПОГРУЖЕНИЕ
![\formula{
\t{procedure ПОГРУЖЕНИЕ}(i);\\
\t begin \\
\mbox{}\q c:= {\rm minchild}(i);\\
\mbox{}\q \t while\ (c \ne 0)\
\t and\
({\rm key}[c] < {\rm key}[i])\ \t do\ \{{\rm tr}(i, c);\
i:= c;\ c := {\rm minchild} (c)\}\\
\t end;
}](/sites/default/files/tex_cache/1bfb6dca00bf5acd6a28ae7f0912706e.png)
![\formula{
\t function\ {\rm minchild} (i);\\
\t begin\ \t if\ i\cdot d + 1 > n\ \t then\
{\rm minchild} := 0\ \t else\\
\mbox{}\q \t begin\\
\mbox{}\q\qq {\rm first\_child}:= i\cdot d + 1;\ {\rm last\_child}:=
\min((i + 1)\cdot d - 1, n);\\
\mbox{}\q\qq{\rm min\_key} := {\rm key}[{\rm first\_child}];\\
\mbox{}\q\qq \t for\ i := {\rm
first\_child}\ \t to\
{\rm last\_child}\ \t do\ \t if\ {\rm key}[i] > {\rm min\_key}\
\t then\\
\mbox{}\q\qq\qq \{{\rm min\_key} := {\rm key}[i];\
{\rm minchild} := i\}\\
\mbox{}\q \t end\\
\t end
}](/sites/default/files/tex_cache/7aeda95ae983ec6255ba29177b73999e.png)
Операция ВСТАВКА. Если перед выполнением этой операции куча
содержала узлов (напомним, что они пронумерованы числами
от
до
), то добавляем к дереву
-й узел
(его номер будет
) и приписываем ему элемент с именем
и ключом
. Вставка нового элемента
производится посредством отведения для него места в
-ых
позициях массивов
и
соответственно,
после чего к добавленному узлу применяется операция ВСПЛЫТИЕ для
восстановления кучеобразного порядка.
Вставим в -кучу, изображенную на
рис. 4.9, новый элемент с ключом
.
Сначала добавляем к дереву новый узел с номером и
приписываем ему элемент с ключом
. Получим дерево, представленное
на рис. 4.10.
Затем применяем к узлу операцию ВСПЛЫТИЕ. При описании этой
операции использовался именно приведенный пример (см. рис. 4.3, 4.4, 4.5).
Вычислительная сложность данной операции равна константе плюс
вычислительная сложность операции ВСПЛЫТИЕ, то есть .
Реализация операции ВСТАВКА
![\formula{
\t{procedure ВСТАВКА}\ ({\rm
name}X, {\rm key}X);\\
\t begin\ {a}[{n}]:= {\rm name}X;
{\rm key}[{n}]:= {\rm key}X;\
\t{ВСПЛЫТИЕ}\ ({n});\ {n}:= {n} + 1\ \t end;
}](/sites/default/files/tex_cache/0aeea88c037b63abc9d6034ec2a86ec4.png)
Операция УДАЛЕНИЕ.
Используется для удаления элемента,
приписанного узлу с заданным номером . Сначала элемент,
приписанный последнему узлу дерева, переносится на место удаляемого элемента,
последний узел при этом становится ненужным и поэтому удаляется из дерева.
Далее, если узел
, в который помещен новый элемент, имеет
родителя с большим ключом, то к узлу
применяется операция ВСПЛЫТИЕ,
в противном случае — ПОГРУЖЕНИЕ.
Таким образом, ориентируясь на худший случай, вычислительную сложность
операции УДАЛЕНИЕ оцениваем величиной .
Реализация операции УДАЛЕНИЕ
![\formula{
\t{procedure УДАЛЕНИЕ}(i);\\
\t begin\ {a}[{i}]:= {a}[{n} - 1];\
{\rm key}[{i}]:= {\rm key}[{n} - 1];\ {n}:= {n} - 1; \\
\mbox{}\q \t if\ i \ne 0\ \t and\ {\rm key}[{i}]
({\rm key}[(i - 1) \mathop{\rm div} {d}]\ \t then\ \t{ВСПЛЫТИЕ}({i})\\
\mbox{}\q \t else\
\t{ПОГРУЖЕНИЕ}({i})\\ \t end;
}](/sites/default/files/tex_cache/e2a4d93e0526d241838c7f3c637f1987.png)
Операция УДАЛЕНИЕ_МИНИМУМА. Эта операция предназначена для взятия из кучи элемента с минимальным ключом (он находится в корне дерева) и удаления его из кучи с помощью операции УДАЛЕНИЕ.
Реализация операции УДАЛЕНИЕ_МИНИМУМА
![\formula{
\t{procedure
УДАЛЕНИЕ\_МИНИМУМА}\ ({\rm name}X, {\rm key}X);\\
\t begin\ {\rm name}X:= {a}[0];\
{\rm key}X:= {\rm key}[0];\
\t{УДАЛЕНИЕ}\ (0)\ \t end;
}](/sites/default/files/tex_cache/6cfe3d0f44ef57e821c52b6b15595a1b.png)
Функция MINKEY. Эта функция предназначена для определения минимального ключа без удаления соответствующего элемента.
Реализация функции MINKEY
![\formula{
\t function\ {\rm MINKEY};\
\t begin\
{\rm MINKEY}: = {\rm key}[0]\ \t end;
}](/sites/default/files/tex_cache/0d4c850c6beeb277fbc917706fa02eb3.png)