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

Тонкие кучи

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

Представление тонкой кучи в памяти компьютера.

Тонкие кучи формируют из узлов, представленных записями следующего вида:

\eq*{
{\rm Node} = ({\rm Key}, {\rm Left}, {\rm Right}, {\rm LChild},
{\rm Rank}),
}
где {\rm Key} — ключ элемента, приписанного узлу; {\rm Left} — указатель на ближайшего левого брата, если такового нет, то на родителя, а если нет и родителя, то указатель заземлен; {\rm Right} — указатель на ближайшего правого брата, если такового нет, то указатель заземлен; {\rm LChild} — указатель на самого левого сына, если такового нет, то указатель заземлен; {\rm Rank}ранг узла.

Таким образом, узлы-братья связаны в двусвязный список при помощи указателей {\rm Left} и {\rm Right}. У самого левого брата в этом списке указатель {\rm Left} указывает на общего родителя всех узлов в списке. У самого правого брата из списка указатель {\rm Right} заземлен. Корни деревьев в тонкой куче связаны в односвязный циклический список. Этот список будем называть корневым списком. Корневой список реализуется при помощи поля {\rm Right}. Поле {\rm Left} у каждого узла корневого списка заземлено.

В случае необходимости в описании узла может присутствовать и другая прикладная информация. На рис. 8.2 приведен пример тонкой кучи.

Тонкая куча

Тонкая куча

Представление кучи со ссылками, в узлах указаны ранги


Рис. 8.2.

Заметим, что принадлежность заданного узла корневому списку кучи осуществляется проверкой указателя {\rm Left} на заземленность.

Введем еще одну запись {\rm Heap}, которая будет соответствовать отдельной куче и иметь вид

\eq*{
{\rm Heap} = ({\rm First}, {\rm Min}),
}
где {\rm First} — указатель на начальный элемент корневого списка; {\rm Min} — указатель на элемент корневого списка с минимальным ключом.

Очевидно, что узел с минимальным ключом обязательно находится в корневом списке.

Реализация основных операций и оценки трудоемкости

Сосредоточим внимание на амортизационных оценках трудоемкости. Будем получать их методом потенциалов. Потенциалом тонкой кучи будем считать величину \Phi = n + 2\cdot m, где n — количество деревьев в куче, а m — число помеченных вершин. Заметим, что потенциал кучи неотрицателен и в начальный момент равен 0.

Операция MakeHeap. Эта операция создает указатель на новую пустую кучу. Очевидно, фактическая стоимость операции есть O(1), а потенциал созданной кучи равен 0.

Операция FindMin (H). Указатель на узел с минимальным ключом в куче H определяется с помощью указателя {\rm Min}. Если куча пуста, то результирующий указатель нулевой. Амортизационная оценка совпадает с фактической и равна O(1), потенциал не изменяется.

Операция Insert(i,H). С помощью этой операции осуществляется вставка в кучу H нового элемента с ключом i. При ее реализации создается новое тонкое дерево ранга 0, которое вставляется в корневой список кучи H, разрывая его в произвольном месте. При необходимости перевычисляется ссылка на минимальный элемент.

Операция увеличивает потенциал на 1, так как добавляется одно дерево в корневой список кучи, но это не влияет на амортизационную оценку, которая равна фактической O(1).

Операция Meld(H1, H2). Результатом этой операции является указатель на кучу, полученную слиянием двух куч H_1 и H_2. Она осуществляется соединением корневых списков сливаемых куч. При таком способе выполнения операции, как и при реализации вставки элемента в кучу, можем получить в корневом списке результирующей кучи несколько деревьев одинакового ранга. При удобном случае, а именно при удалении минимального элемента, мы освободим корневой список от этой неоднозначности. Оценка совпадает с оценками для всех предыдущих операций. Суммарный потенциал не изменяется.

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

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