Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[140]

се этих преобразований вершина w остаётся потомком вершины ж.

Инвариант цикла while (строки 6-12) таков: «d = degree[x]; осталось добавить дерево с корнем в ж к множеству, представленному массивом А». Если при этом A[d] = nil, то мы выполняем эту операцию (добавление) в строке 13. Если же A[d] ф nil, то мы имеем два дерева степени d с корнями в ж и у = A[d], и в строках 8-10 соединяем их в одно дерево с корнем в ж (одновременно очищая ячейку A[d] и сохраняя инвариант).

Различные стадии этого процесса показаны на рис. 21.3.

После этого остаётся преобразовать массив А в корневой список: в строке 14 мы создаём пустой список, а в цикле в строках 15-19 добавляем в него по очереди все вершины, имеющиеся в массиве А. Результат показан на рис. 21.3м.

На этом процесс уплотнения заканчивается, и управление возвращается в процедуру Fib-Heap-Extract-Min, которая уменьшает п[Н] на 1 и возвращает указатель на изъятую вершину z (строки 11-12).

Заметим, что если перед выполнением операции Fib-Heap-Extract-Min все деревья в Н были неупорядоченными биномиальными деревьями, то и после выполнения операции Н будет состоять из неупорядоченных биномиальных деревьев. В самом деле, соединение двух неупорядоченных биномиальных деревьев с одина-


ковыми степенями корня (процедура Fib-Heap-Link) даёт (неупорядоченное) биномиальное дерево (степень его корня на единицу больше).

Нам осталось показать, что учётная стоимость изъятия минимальной вершины из га-элементной фибоначчиевой кучи есть 0(D(n)). Посмотрим, какие операции нам пришлось выполнить. Прежде всего нужно 0(D(n)) действий, чтобы поместить всех потомков удаляемой вершины z в корневой список. Начальный и конечный этапы работы процедуры Consolidate (строки 1-2 и 1519) также требует времени 0(D(n)). Остаётся учесть вклад цикла for, расположенного в строках 3-13. Это число оценивается сверху как 0(D(n)) (размер массива А) плюс константа, умноженная на число обращений к процедуре Fib-Heap-Link. Но при каждом таком обращении два дерева сливаются, что приводит в итоге к уменьшению длины корневого списка на 1 и к уменьшению потенциала по крайней мере на 1 (число отмеченных вершин может уменьшиться, но не увеличиться). Так что умножив потенциал на подходящую константу, мы можем считать, что учётная стоимость операции удаления есть 0(D(n)).

Другими словами, операции связывания деревьев одинаковой степени (которых может быть много, если корневой список длинный) оплачиваются как раз за счёт уменьшения длины корневого списка!

Упражнения

21.2-1 Нарисуйте фибоначчиеву кучу, которая получится в результате изъятия минимальной вершины (с помощью процедуры Fib-Heap-Extract-Min) из кучи рис. 21.3м.

21.2-2 Докажите, что лемма 20.1 остаётся верной для неупорядоченных биномиальных деревьев, если свойство 4 заменить на свойство 4: корень неупорядоченного биномиального дерева Uk имеет степень к, которая является максимальной степенью вершины в дереве; дети корня являются вершинами деревьев Со, U\,..., Uk-i (в некотором порядке).

21.2-3 Покажите, что если выполняются лишь операции, описанные в разделе 21.2, то в куче с га вершинами все вершины имеют степень не больше [lg raj.

21.2-4 Профессор придумал новую структуру данных, основанную на фибоначчиевых кучах: операции выполняются как описано в разделе 21.2, но только после добавления вершины и соединения двух куч сразу же производится уплотнение корневого списка. Каково время выполнения различных операций над такими кучами в


худшем случае? Будет ли такая структура данных чем-то новым?

21.2-5 Будем считать, что ключи можно только сравнивать (их внутренняя структура нам недоступна). Можно ли тогда реализовать операции над сливаемыми кучами так, чтобы каждая из них имела учётную стоимость 0(1)? (Указание: используйте оценки для времени сортировки.)

В этом разделе мы покажем, как реализовать операцию уменьшения ключа заданной вершины с учётной стоимостью 0(1), а также операцию удаления вершины из фибоначчиевой кучи с учётной стоимостью 0(D(n)) (где га - число вершин в куче), a D(n) - оценка для максимальной степени вершины.

После этих операций входящие в кучу деревья перестают быть биномиальными, но не слишком далеко отклоняются от них, так что максимальная степень вершины остаётся равной О (lg га). Таким образом, операции Fib-Heap-Extract-Min и Fib-Heap-Delete имеют учётную стоимость О (lgra).

Уменьшение ключа

В следующей процедуре уменьшения ключа (Fib-Heap-Decrease-Key) мы предполагаем, что после изъятия вершины из списка ссылка на вершину-ребёнка не меняется (так что процедура Сит вырезает целое поддерево, см. ниже)

Fib-Heap-Decrease-Key (Я, ж, к)

1if к > кеу[х]

2then error «новое значение ключа больше старого»

3кеу[х] <- к

4у <- р[х]

5if у ф nil and кеу[х] < кеу[у]

6then Сит(Я, ж, у)

21.3. Уменьшение ключа и удаление вершины

7 8 9

if кеу[х] < кеу[тгп[Н]] then тгп[Н] <- ж



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]