Толстая куча на избыточном счётчике
Содержание
Толстое дерево (статья пишется - ничего не трогать!)
- Толстое дерево ранга ноль состоит из единственного узла.
- Толстое дерево ранга , для , состоит из трех деревьев ранга , связанных так, что корни двух из них являются самыми левыми потомками корня третьего.
//[[Файл:ThickTreeExample.gif Пример толстых деревьев ]]
Свойства Толстых деревьев
| Утверждение: |
Свойства толстых деревьев:
|
| Определение: |
| лес будем называть нагруженным, если он состоит из нескольких толстых деревьев, ранги которых не обязательно попарно различны и узлам которых взаимно однозначно поставлены в соответствие элементы взвешенного множества. |
| Определение: |
| Узел в нагруженном лесе назовем неправильным, если его ключ меньше ключа его родителя. |
| Определение: |
| Нагруженный лес назовем почти кучеобразным, если для каждого значения в нем имеется не более двух неправильных узлов ранга . |
Толстые кучи
| Определение: |
| Толстая куча — это почти кучеобразный нагруженный лес. |
Представление толстой кучи
Каждый узел толстой кучи будем представлять записью со следующими полями:
- — ключ элемента, приписанного узлу дерева
- — указатель на родителя
- — указатель на ближайшего левого брата
- — указатель на ближайшего правого брата
- — указатель на самого левого сына
- — ранг узла.
"Братья" связаны в двусвязный список при помощи указателей и . У самого левого (правого) "брата" в этом списке указатель () равен .
//[[Файл:ThickTreeExample.gif Пример толстых деревьев ]]
Вспомогательные структуры
Основные операции
- —
заключается в инициализации счетчиков.
- —
возвращает указатель на минимальный элемент.
- —
Чтобы выполнить эту операцию, делаем новый элемент отдельным деревом и выполняем процедуру вставки нового элемента ранга в корневой счетчик. После этого, если необходимо, корректируем значение указателя на минимальный элемент.
- —
Чтобы выполнить эту операцию, поступим следующим образом. Пусть — узел, на который указывает указатель . Вычитаем из ключа узла . Если новый ключ меньше минимального ключа кучи , обмениваем ключ элемента с ключом минимального элемента. Новых нарушений операция не создаст. Пусть — ранг . Если — нарушаемый узел, добавляем как новое -ранговое нарушение инкрементированием -й цифры счетчика нарушений.
- —
Удаляем поддерево с корнем в минимальном узле из леса. Минимальность этого элемента гарантирует нам, что среди его детей нарушений порядка кучи не было. То есть нет необходимости работать со счетчиком нарушений. Затем вставляем в кучу все деревья с корнями, расположенными в детях удаляемого узла. Очевидно, что новый минимальный ключ — либо в корне дерева леса, либо в нарушенном узле. Выполняем поиск нового минимального элемента среди корней деревьев и нарушенных узлов. Если минимальный элемент оказался в нарушенном узле, то обмениваем его с элементом, хранимым в корне этого дерева, корректируя корневой счетчик, если это необходимо. После замены новый минимум — в корне дерева леса. Этот корень будет новым минимальным узлом.
- —
выполняем а затем
- —
Первый шаг — фиксируются все нарушения в куче с меньшим максимальным рангом (разрывая связь произвольно). Не уменьшая общности, считаем, что эта куча — . Пройти по счетчику нарушений от младшей цифры к старшей, пропуская цифры со значением . Для -й цифры делаем операцию фиксирования на каждой цифре, показываемой прямым указателем , если эта цифра имеет значение 2. Затем, если , фиксируем . Если , преобразуем это -ранговое нарушение в -ранговое нарушение, как при фиксировании, используя -рангового брата нарушенного узла вместо (несуществующего) другого -рангового нарушения. Как только не будет содержать каких-либо нарушений, нужно вставить корни из корневого счетчика в корневой счетчик инкрементированием соответствующих цифр. Если минимальный узел содержит меньший ключ, чем минимальный узел , следует установить новым минимальным узлом минимальный узел . Затем нужно вернуть модифицированную кучу в качестве результата .