на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Тонкие кучи
Рассмотрим теперь, как можно перестроить дерево, чтобы избавиться от
братского нарушения либо свести его к родительскому. Пусть узел
— это узел локализации братского нарушения. Рассмотрим два возможных
варианта.
Узел не помечен, то есть ранг его самого левого сына на
единицу меньше ранга самого узла
. Пример — на рис. 8.5.
В данном случае, чтобы исправить братское нарушение, помещаем на место
пропущенного в братском списке поддерева поддерево с корнем в самом левом
сыне узла . Узел
при такой операции становится
помеченным, но зато дерево теперь удовлетворяет всем трем свойствам
определения тонкого дерева. Очевидно, что это операция заканчивает
процедуру исправления дерева.
Узел помечен, тогда уменьшаем ранг узла
на
единицу. Это не исправит дерева, но зато теперь узлом локализации нарушения будет левый
брат узла
либо его родитель. В последней ситуации нарушение
становится родительским. Пример приведен на рис. 8.6.
Таким образом, мы либо исправим структуру дерева, либо рекурсивно придем к узлу локализации родительского нарушения.
Выясним, чтo же делать с родительскими нарушениями. Пусть
узел —
это узел локализации родительского нарушения, а узел
—
родитель узла
. Тогда предлагается переместить поддерево с корнем
в узле
в корневой список кучи, делая при этом
узел
непомеченным. Считаем, что
— это не корень дерева. Если
узел
не был помечен, то, очевидно, процедура исправления дерева
закончена. Если он был помечен, то считаем его узлом локализации нового родительского
нарушения. При этом, очевидно, количество помеченных узлов уменьшится на
единицу. Продолжая такого вида рекурсивные шаги, мы либо дойдем до корня
дерева, либо исправим его структуру раньше. Если узел
стал
корнем, то для того чтобы исправить структуру дерева, необходимо лишь сделать ранг
корня на единицу большим ранга его самого левого сына. На этом процедура
исправления дерева будет закончена.
Заметим, что каждый промежуточный шаг рекурсии уменьшает число помеченных
узлов на единицу и добавляет в корневой список не более одного дерева.
Тогда потенциал при каждом шаге рекурсии уменьшается как минимум на
единицу. Отсюда и следует обещанная оценка времени выполнения
операции
.
Операция Delete(i,H)
удаляет элемент из кучи
следующим образом. Ключ удаляемого элемента
уменьшается до
некоторого значения, меньше минимального, и элемент удаляется как
минимальный. Очевидно, что трудоемкость этой операции
есть
.
Итак, амортизационная трудоемкость выполнения операций\linebreak и
на тонкой куче из
элементов
равна
, а для остальных операций, как было показано
ранее, —
.