Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1801 / 486 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 8:

Тонкие кучи

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

Операция DeleteMin(H). Эта операция предназначена для удаления узла с минимальным ключом из непустой кучи H. Для ее реализации удаляем минимальный узел из корневого списка кучи H, добавляем список детей удаленного узла в корневой список и повторяем следующий "связывающий шаг".

Находим любые два дерева, корни которых имеют одинаковые ранги, и связываем их, делая корень с большим ключом новым левым потомком корня с меньшим ключом, увеличивая ранг нового полученного тонкого дерева на единицу. При этом следует удалить из корневого списка кучи H корень с большим ключом. Как только не останется деревьев с корнями одинакового ранга, в полученном корневом списке необходимо найти элемент с минимальным ключом.

Рассмотрим теперь, с помощью каких средств реализуется связывающий шаг. Для хранения ссылок на корни деревьев используем временный массив {\rm RankT}, размера D(n). Величина {\rm RankT}[i] будет указателем на тонкое дерево ранга i. Если найдется еще одно дерево ранга i, то свяжем два дерева ранга i в одно дерево ранга i + 1, в i -й ячейке массива {\rm
RankT} установим нулевой указатель и продолжим связывающую процедуру с вновь полученным деревом ранга i + 1.

При включении списка детей необходимо учесть возможность помеченности детей минимального узла. То есть уменьшить их ранг там, где это необходимо. Это требование вытекает из свойства 2 определения тонкого дерева. Очевидно, что для проверки помеченности узла требуется O(1) операций.

В результате выполнения связывающих шагов получаем заполненный массив {\rm RankT}. Теперь остается только связать все деревья, находящиеся в этом массиве, в корневой список и найти в этом списке новый минимальный элемент. Очевидно, все это можно выполнить с трудоемкостью O(D(n)).

Чтобы оценить амортизационную стоимость операции {\rm
DeleteMin}, подсчитаем фактическую стоимость операции и изменение потенциала. Фактическая стоимость складывается из O(1) операций на проверку кучи на пустоту, O(D(n)) действий при добавлении детей минимального узла в корневой список и O (количество связывающих шагов) + O(D(n)) при выполнении связывающих шагов.

В итоге фактическая стоимость операции удаления минимального элемента есть O (количество связывающих шагов) + D(n).

Очевидно, что потенциал уменьшился, как минимум, на число связывающих шагов, так как при каждом связывающем шаге количество деревьев в корневом списке уменьшается на единицу. Поскольку амортизационная стоимость равна фактической стоимости плюс изменение потенциала, то амортизационная стоимость равна O(D(n)).

Операция DecreaseKey (\Dl, i,
H). При уменьшении ключа у некорневого элемента i в куче H на величину \Dl может быть нарушено свойство кучеобразности. Для восстановления этого свойства перемещаем поддерево с корнем в изменяемом элементе в корневой список, но при этом, возможно, оставшееся после переноса дерево может не оказаться тонким.

Покажем, как, затратив O(1) амортизированного времени, исправлять его структуру. В процедуре {\rm DecreaseKey} после уменьшения ключа корректируется, если это необходимо, указатель на минимальный элемент кучи. После этого проверяется, не является ли измененный узел x корнем дерева T. Если это действительно так, то процедура завершается, в противном случае переносим поддерево с корнем в узле x в корневой список кучи и запускаем процедуру коррекции оставшегося дерева T'.

Будем различать два вида нарушений свойств тонкого дерева:

  1. Братские нарушения — это нарушения третьего правила из определения тонкого дерева.
  2. Родительские нарушения — это нарушения первого или второго правила.

Рассмотрим подробнее каждое из двух видов нарушений. Назовем узел y узлом локализации братского нарушения среди детей узла z, если ранг узла y отличается от ранга его ближайшего правого брата на 2, либо он не имеет правого брата и его ранг равен 1. Пример — на рис. 8.3.


Рис. 8.3.

Назовем узел y узлом локализации родительского нарушения, если выполнено одно из трех условий:

  1. Ранг узла y на три больше, чем ранг его самого левого сына.
  2. Ранг узла y равен двум, и он не имеет детей.
  3. Узел y есть помеченный корень дерева.

Пример приведен на рис. 8.4.


Рис. 8.4.
< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...