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

Толстые кучи

Ключевые слова: представление, Толстая куча, счетчик, Основные определения, регулярным, произвольное, Фиксацией цифры b, стоящей в i-м разряде представления d, Операция фиксации, значение, толстое дерево, ранг, Свойства толстых деревьев, Лес, множества, ключ, указатель, Ранг узла, двусвязный, список, Счетчик нарушений, массив, определение, запись, Обновление прямого указателя i-го разряда корневого счетчика, Корректировка списочной части i-го разряда корневого счетчика при вставке в кучу нового дерева ранга i, дерево, Корректировка списочной части i-го разряда корневого счетчика при удалении из кучи дерева ранга i, Связывание (Fastening (p1, p2, p3)) трех толстых деревьев ранга i в одно толстое дерево ранга i +1, функция, Функция GetKey (p) по указателю p на элемент определяет значение его ключа, Функция MinKeyNodeRoot(p), ПО, Операция фиксации FixRootCount, операции, поле, Инкрементирование i-го разряда корневого счетчика (IncRootCount (i,p)), Процедура удаления дерева из кучи, Нахождение дерева с минимальным ключом в корне, уменьшение ключа, Представление счетчика нарушений, прямой, Инициализация нового звена., Свойство регулярности, поддерево, Инкрементирование i-го разряда счетчика нарушений, Удаление нарушения из кучи, Нахождение узла с минимальным значением ключа среди всех нарушений., Операция make-heap, Операция FindMin, Операция Insert(key), Операция уменьшения ключа DecreaseKey , Операция DeleteMin, поиск, минимум, Операция удаления элемента, Операция Meld, связь, куча, Операция DeleteViolation, операторы, Сводные сведения о трудоемкости операций с приоритетными очередями, Самоорганизующаяся куча

Рассматриваемое в этой лекции представление приоритетной очереди основано на использовании так называемых избыточных счетчиков, позволяющих за время O(1) инкрементировать любой разряд. Заметим, что использованные здесь счетчики — лишь один из способов реализации толстых куч. На самом деле, для их реализации подойдет произвольный d-арный счетчик, при условии, что трудоемкость инкрементирования любого его разряда является константной.

Избыточное представление чисел

Основные определения. Избыточным b -арным представлением неотрицательного целого числа x будем считать последовательность d = d_n, d_{n-1}\dts d_0, такую, что

\eq*{
x=\suml_{i=0}^{n}d_{i} b^{i},
}
где d_i \in \{0, 1\dts b\}, i \in \{0, 1\dts n\}. Будем называть d_i цифрой, стоящей в i -м разряде. В примерах запятые между цифрами опускаем.

Заметим, что избыточное представление отличается от обычного b -арного представления использованием "лишней" цифры b, что приводит к неоднозначности представления чисел. Например, при b =
3 число 3 может быть представлено как 3 и как 10.

В примерах, в которых b = 10, "цифру" 10 будем обозначать символом b.

Назовем b -арное избыточное представление числа регулярным, если в нем между любыми двумя цифрами, равными b, найдется цифра, отличная от b - 1.

Пример. Пусть b = 10, а число x представляется в обычной десятичной системе последовательностью 1100, тогда представления b9b и bb0 не являются регулярными b -арными избыточными представлениями числа x, а представления 1100 и 10b0 регулярны.

Пусть L(i) — номер разряда, отличного от b -
1 и ближайшего слева от i -го разряда в регулярном b -арном избыточном представлении d.

Определим L'(i) следующим образом: L'(i) = L(i), если d_i \in \{{b - 1}, b - 2\} и d(L(i)) = b ; L'(i)произвольное число > i, если d_i \in \{b - 1, b - 2\} и d(L(i)) < b - 1 ; L'(i) — не определено, если d_i \not\in \{b - 1, b - 2\}.

Величину L'(i) будем называть прямым указателем. Пусть d = d_n,\ldots, d_0b -арное регулярное представление некоторого числа.

Фиксацией цифры b, стоящей в i-м разряде представления d, ({\rm Fix (i)}) назовем операцию, заключающуюся в обнулении цифры d_i и инкрементировании цифры d_{i+1}, при этом если i = n, то полагаем d_{n+1}= 1. При каждом выполнении операции фиксации будем обновлять значение L'(i). Очевидно, при b > 2 операцию {\rm Fix}(i) можно выполнить с помощью следующих операторов.

\formula{
\t if\ d_i = b\ \t then\ \{d_i:= 0;\ d_{i+1}:= d_{i+1}+1\};\\
\t if\ d_{i+1} = b - 1\ \t then\ L'(i):= L'(i+1)\
\t else\ L'(i):= i+1;
}

Инкрементирование i-й цифры избыточного представления d {\rm Inc (i)} можно выполнить с помощью операторов

\formula{
{\rm Fix}(i);\ \t if\ (d_i = b -1)\
\t{or}\ (d_i = b - 2)\
\t then\ {\rm Fix}(L'(i));\ d_i:= d_i
+ 1;\ {\rm Fix}(i);
}

Очевидно, что инкрементирование i -го разряда регулярного b -арного избыточного представления числа x производит представление числа x = x + b^i.

Нетрудно доказать, что операции фиксации и инкрементирования, примененные к регулярному избыточному представлению, не нарушают регулярности и корректно вычисляют указатели L с трудоемкостью O(1).

Эта схема может быть расширена для выполнения за константное время декрементирования произвольной цифры добавлением дополнительного цифрового значения b + 1. Оставляем детали в качестве упражнения.

Толстые деревья

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

Определяем толстое дерево F_k ранга k (k = 0, 1, 2,\ldots) следующим образом:

  • Толстое дерево F_0 ранга ноль состоит из единственного узла.
  • Толстое дерево F_k ранга k, для k\ge 1, состоит из трех деревьев F_{k-1} ранга k- 1, связанных так, что корни двух из них являются самыми левыми потомками корня третьего.

Ранг узла x в толстом дереве определяется как ранг толстого поддерева с корнем в узле x.

На рис. 9.1 приведены примеры толстых деревьев.


Рис. 9.1.

Свойства толстых деревьев:

  1. В толстом дереве ранга k ровно 3^k узлов.
  2. Для любого натурального числа n существует лес из толстых деревьев, в котором ровно n узлов. Такой лес можно построить, включив в него столько деревьев ранга i, каково значение i -го разряда представления числа n в троичной системе счисления. Заметим, что для построения такого леса можно использовать и избыточные троичные представления.
  3. Толстый лес из n узлов содержит O(\log n) деревьев.

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

Антон Сиротинкин
Антон Сиротинкин

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

Семен Дядькин
Семен Дядькин
Беларусь, Минск, БГУ, 2003
Μаксим Εфремов
Μаксим Εфремов
Россия