Изменения

Перейти к: навигация, поиск

Толстая куча на избыточном счётчике

1 байт добавлено, 22:37, 7 июня 2015
Корневой счетчик
Значение его <tex>i</tex>-го разряда равно количеству деревьев ранга <tex>i</tex>, присутствующих в куче. При таком определении избыточного корневого представления число, которое оно представляет, равно числу узлов в куче, так как толстое дерево ранга <tex>i</tex> содержит ровно <tex>3^i</tex> узлов.
Заметим, что состояние избыточного корневого представления определяется неоднозначно. Очевидно, что для любой толстой кучи, состоящей из <tex>n</tex> элементов, существует регулярное избыточное представление корневого счетчика.
Списочный элемент, приписанный <tex>i</tex>-му разряду избыточного корневого представления, — это указатель на список деревьев ранга <tex>i</tex>, присутствующих в куче, образованный посредством указателей <tex>Rightright</tex> корневых узлов связываемых деревьев.
{{Утверждение
'''Корневой счетчик''' представляем расширяющимся массивом <tex>RootCount</tex> , каждый элемент которого — запись с тремя полями:
*<tex>RootCountrootCount[i].Value</tex> {{---}} <tex>i</tex>-й разряд равный количеству деревьев ранга <tex>i</tex>.*<tex>RootCountrootCount[i].ForwardPointerforwardPointer</tex> {{---}} прямой указатель <tex>i</tex>-го разряда.*<tex>RootCountrootCount[i].ListPointerlistPointer</tex> {{---}} указатель на список деревьев ранга <tex>i</tex>, присутствующих в толстой куче. Деревья в этом списке связаны при помощи указателя <tex>Right</tex> корневых узлов связываемых деревьев. Если в куче нет деревьев ранга <tex>i</tex> , то указатель <tex>ListPointerlistPointer</tex> равен <tex>NULL</tex>. ''Заметим, что если значение равно нулю, то нам неважно значение указателя'' <tex>RootCountrootCount[i].ListPointerlistPointer</tex>.
===Инициализация===
===Корректировка при удалении===
Корректировка списочной части <tex>i</tex>-го разряда корневого счетчика при удалении из кучи дерева ранга <tex>i~(DeleteTreedeleteTree(i,p))</tex>. Эта процедура удаляет дерево ранга <tex>i</tex> (на него указывает указатель <tex>p</tex>) из списочной части <tex>i</tex>-го разряда корневого счетчика <tex>RootCountrootCount</tex> . Будем считать, что указанное дерево присутствует в куче. Процедура заключается в выполнении следующего псевдокода:
<code>
Процедура удаления дерева из кучи подразумевает наличие в куче этого дерева. Пусть удаляемое дерево имеет ранг <tex>i</tex> . Тогда значение <tex>i</tex>-го разряда избыточного корневого представления не равно нулю. То есть уменьшение этого значения на единицу не испортит регулярности представления и не потребует обновления каких-либо указателей. Необходимо лишь соответствующим образом обработать списочную часть.
<code>
Deletedelete(i, p): DeleteTreedeleteTree(i, p) RootCountrootCount[i].Value = RootCountrootCount[i].Value - 1
</code>
===Нахождение дерева с минимальным ключом в корне (<tex>MinKeyminKey()</tex>)===
<code>
MinKeyminKey() MinP minP = NULL '''for''' i = 0 to MaxRankmaxRank: p1 = MinKeyNodeRootminKeyNodeRoot(RootCountrootCount[i].ListPointerlistPointer) '''if''' GetKeygetKey(p1) < GetKeygetKey(MinPminP): MinP minP = p1 '''return''' MinPminP
</code>
Анонимный участник

Навигация