и так до тех пор,
в узел , затем из узла в узел
и так до тех пор, пока не освободится узел для запомненного элемента. После этого поместить запомненный элемент на освободившееся место. Более точно это можно выразить с помощью следующих операторов:
Операция ПОГРУЖЕНИЕ. Эта операция также применяется для восстановления свойства кучеобразности. Пусть, например, в -м узле расположен элемент , нарушающий кучеобразный порядок таким образом, что ключ элемента больше ключа элемента , приписанного потомку узла . В этом случае среди непосредственных потомков узла выбирается элемент с наименьшим ключом, и элементы и меняются местами. Если после этого элемент снова не удовлетворяет условиям кучи, то еще раз проводим аналогичную перестановку. И так до тех пор, пока не встанет на свое место.
Рассмотрим -дерево, представленное на рис. 4.6. В узле расположен элемент с ключом , и этот узел имеет двух потомков с меньшими ключами, а именно и . Применим к элементу
операцию ПОГРУЖЕНИЕ.
Рис. 4.6. Среди непосредственных потомков узла 1 находим узел, которому приписан элемент с наименьшим ключом, в нашем случае это узел c ключом . Меняем местами элементы
и . В результате получается дерево, изображенное на рис. 4.7.
Рис. 4.7. Теперь элемент снова имеет потомка с меньшим, чем у него, ключом (а точнее, оба его потомка имеют меньшие ключи). Снова находим непосредственного потомка элемента с наименьшим ключом, и меняем его и местами. Получается дерево, изображенное на рис. 4.8.
Рис. 4.8. Теперь находится в узле 17 и не имеет потомков с меньшим, чем у него, ключом (точнее, у него вообще нет потомков). Операция ПОГРУЖЕНИЕ завершена.
Вычислительная сложность этой операции пропорциональна числу сравнений элементов и их обменов. Для каждого узла в пути следования данной операции производится сравнений (при поиске потомка с минимальным ключом) и один обмен. Длина этого пути в -куче с узлами не превосходит ее высоты, а именно , по доказанному выше утверждению 1. Значит, время выполнения данной операции — .
Для реализации операции погружения воспользуемся функцией\linebreak , позволяющей для любого узла находить его непосредственного потомка с минимальным ключом.
Содержание Назад Вперед