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

Ленивые левосторонние и самоорганизующиеся кучи

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

Самоорганизующаяся куча

Самоорганизующаяся куча — это представление приоритетной очереди корневым деревом, операции с которым производятся аналогично операциям с левосторонней кучей, но без использования рангов. Длина правого пути из корня такого дерева в лист может быть произвольной, поэтому время выполнения всех операций в худшем случае есть O(n), где n — число элементов в очереди. Однако среднее время выполнения m произвольных операций есть O(m \log n), то есть время, приходящееся на одну операцию, как ни удивительно, является величиной O(\log n). Для их реализации необходимо с каждым узлом дерева хранить элемент, его ключ, указатели на левое и правое поддеревья, то есть узлы представлять записями вида

\eq*{
{\rm Node} = (\t element,
\t key, \t left, \t right).
}

Операция СЛИТЬ кучи h_1 и h_2 в одну кучу h выполняется следующим образом. Правые пути двух исходных куч h_1 и h_2 сливаются в один путь, упорядоченный по правилам кучи, и этот путь становится левым путем результирующей кучи h. Левые поддеревья узлов, попавших в результирующий левый путь, становятся правыми.

Операция ВСТАВИТЬ в кучу h новый элемент x производится посредством слияния кучи h с кучей, содержащей единственный элемент x. Таким образом, время выполнения этой операции равно времени выполнения операции СЛИТЬ.

Операция УДАЛИТЬ_ЭЛЕМЕНТ_С_МИНИМАЛЬНЫМ_КЛЮЧОМ производится посредством удаления корня кучи h и слияния его левой и правой подкуч. Таким образом, вычислительная сложность этой операции равна вычислительной сложности операции СЛИТЬ.

Операция НАЙТИ_ЭЛЕМЕНТ_С_МИНИМАЛЬНЫМ_КЛЮЧОМ выполняется, очевидно, за время O(1), так как этот элемент находится в корне.

Анализ времени выполнения операции СЛИТЬ. Поскольку время выполнения всех трудоемких операций определяется временем выполнения операции СЛИТЬ, остается проанализировать именно эту операцию. Очевидно, время ее выполнения пропорционально количеству узлов в правых путях исходных куч h_1 и h_2. Длина такого пути в худшем случае может зависеть линейно от количества узлов в соответствующей куче. Таким образом, время выполнения операции СЛИТЬ есть величина O(n_1+n_2) =O(n), где n_1, n_2, n — количества узлов в кучах h_1, h_2, h, соответственно.

Нахождение суммарной оценки времени выполнения m операций СЛИТЬ. Введем определение. Узел назовем тяжелым, если количество узлов в его правом поддереве строго больше, чем в левом. Остальные узлы назовем легкими.

Определим потенциал коллекции куч как общее количество содержащихся в ней тяжелых узлов. Пусть P_jпотенциал коллекции после выполнения jоперации.

< Лекция 5 || Лекция 6: 123 || Лекция 7 >
Антон Сиротинкин
Антон Сиротинкин

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