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

Тонкие кучи

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

Рассматриваемые здесь тонкие и, в следующей лекции, толстые кучи предложены М.Фредманом и Х.Капланом как альтернатива фибоначчиевым кучам. Долгое время фибоначчиевы кучи считались рекордными по производительности. Оценки операций над фибоначчиевыми кучами имеют амортизационный характер, а скрытые в них константы велики настолько, что реальный выигрыш во времени работы с ними достигался только на данных "астрономических" размеров. Рассматриваемые здесь тонкие кучи имеют те же асимптотические оценки, что и фибоначчиевы, но гораздо практичнее их. Оценки для толстых куч "хуже" по операции слияния, выполняемой за O(\log n) времени. Достоинством этой структуры является то, что ее оценки рассчитаны на худший случай. Заметим, что на данный момент ни фибоначчиевы, ни толстые, ни тонкие кучи не являются рекордными, так как Г.Бродал предложил новую структуру, которую мы будем называть кучей Бродала. Кучи Бродала характеризуется такими же, как и фибоначчиевы кучи, оценками операций, но все оценки справедливы для худшего случая. К сожалению, структура, предложенная Г.Бродалом, сложна для реализации. Рассмотрим реализацию приоритетной очереди с помощью тонкой кучи.

Основные определения

Тонкие кучи, как и многие другие кучеобразные структуры, аналогичны биномиальным кучам.

Тонкое дерево T_k ранга k — это дерево, которое может быть получено из биномиального дерева B_k удалением у нескольких внутренних, то есть не являющихся корнем или листом, узлов самого левого сына. Заметим, что у листьев детей нет, а если у корня B_k удалить самого левого сына, то B_k превратится в B_{k-1}. Ранг тонкого дерева равен количеству детей корня.

Для любого узла x в дереве T_k обозначим: {\rm Degree} (x) — количество детей узла x ; {\rm Rank}(x)ранг соответствующего узла в биномиальном дереве B_k.

Тонкое дерево T_k удовлетворяет следующим условиям:

  1. Для любого узла x либо {\rm Degree}
(x) = {\rm Rank}(x), в этом случае говорим, что узел x не помечен (полный); либо {\rm Degree} (x) = {\rm Rank}(x) - 1, в этом случае говорим, что узел x помечен (неполный).
  2. Корень не помечен (полный).
  3. Для любого узла x ранги его детей от самого правого к самому левому равны соответственно 0, 1, 2\dts {\rm Degree}(x) - 1.
  4. Узел x помечен тогда и только тогда, если его ранг на 2 больше, чем ранг его самого левого сына, или его ранг равен 1 и он не имеет детей.

На рис. 8.1 приведены примеры тонких деревьев; числа рядом с узлами обозначают их ранги. Вверху изображено биномиальное дерево B_3, внизу — два полученных из B_3 тонких дерева ранга три. Стрелки указывают на помеченные узлы. Заметим, что биномиальное дерево является тонким деревом, у которого все узлы не помечены.

Тонкий лес — это набор тонких деревьев, ранги которых не обязательно попарно различны.


Рис. 8.1.

Тонкая куча — это кучеобразно нагруженный тонкий лес.

Заметим, что в тонкой куче могут встречаться тонкие деревья одинакового ранга, в то время как в биномиальной куче все деревья должны иметь попарно различные ранги.

Утверждение. Для любого натурального числа n существует тонкий лес, который содержит ровно n элементов и состоит из тонких деревьев попарно различных рангов.

Действительно, любой биномиальный лес является тонким, а для биномиального леса рассматриваемое утверждение справедливо.

Пусть D(n) — максимально возможный ранг узла в тонкой куче, содержащей n элементов.

Теорема [22] В тонкой куче из n элементов D(n)\le \log_\Phi (n), где \Phi = (1+\sqrt{5})/2 — золотое сечение.

Доказательство. Сначала покажем, что узел ранга k в тонком дереве имеет не менее F_k \ge \Phi^{k-1} потомков, включая самого себя, где F_kk -е число Фибоначчи, определяемое соотношениями F_0 = 1, F_1 = 1, F_k =
F_{k-2} + F_{k-1} для k \ge 2.

Действительно, пусть T_k — минимально возможное число узлов, включая самого себя, в тонком дереве ранга k. По свойствам 1 и 3 тонкого дерева получаем следующие соотношения:

\eq*{
T_0 = 1,\ T_1 = 1,\  T_{k} \ge 1+\suml_{i=0}^{k-2} T_{i}\q
\t{для}\quad k \ge 2.
}

Числа Фибоначчи удовлетворяют этому же рекуррентному соотношению, причем неравенство можно заменить равенством. Отсюда по индукции следует, что T_k \ge F_k для любых k. Неравенство F_k
\ge \Phi^{k-1} хорошо известно.

Теперь убедимся в том, что максимально возможный ранг D(n) тонкого дерева в тонкой куче, содержащей n элементов, не превосходит числа \log_{\Phi }(n)+1. Действительно, выберем в тонкой куче дерево максимального ранга. Пусть n^\ast — количество вершин в этом дереве, тогда {n \ge n^\ast \ge \Phi^{D(n)-1}}.

Отсюда следует, что D(n) \le \log_{\Phi}(n)+1.

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

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

Светлана Ведяева
Светлана Ведяева
Россия, Саратов
Оксана Пагина
Оксана Пагина
Россия, Москва