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


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




[90]

RB-Delete-Fixup (Г, ж)

1while х ф root[T] и color[x] = black

2do if x = left\p[x]]

3then w <- га 1£[р[ж]]

4if color[w] = red

5then color[w] <- black> Случай 1

6со/ог[р[ж]] <- red> Случай 1

7Left-Rotate (Г, p[x])> Случай 1

8w <- пЛ[р[ж]]О Случай 1

9if color[left[w]] = black и

color[right[w]] = black

10then color[w] <- red> Случай 2

11ж <- р[ж]о Случай 2

12else if color[right[w]] = black

13then color[left[w]] <- black > Случай 3

14color[w] <- red> Случай 3

15Right-Rotate(T, w) о Случай 3

16w <- пЛ[р[ж]]> Случай 3

17color[w] <- со/ог[р[ж]]о Случай 4

18со/ог[р[ж]] <- black> Случай 4

19color[right[w]] <- blackо Случай 4

20Left-Rotate (Г, р[ж])о Случай 4

21ж <- гоо[Г]> Случай 4

22else (симметричный фрагмент с

заменой left -и- right)

23со/ог[ж] <- black

Если удалённая процедурой RB-Delete вершина у была чёрной, то любой путь, через неё проходивший, теперь содержит на одну чёрную вершину меньше. Таким образом, свойство 4 нарушилось. Мы можем компенсировать это за счёт вершины ж (занявшей место вершины у). Если ж - красная, сделаем её чёрной (заодно мы избегаем опасности получить красную вершину с красным родителем). Если ж - чёрная, объявим её «дважды чёрной» и будем считать за две при подсчёте числа чёрных вершин на пути от корня к листьям. Конечно, такой выход может быть лишь временным, поскольку определение красно-чёрных деревьев не предусматривает дважды чёрных вершин, и мы должны постепенно от такой вершины избавиться.

Процедура RB-Delete-Fixup (Г, ж) применяется к дереву, которое обладает свойствами красно-чёрного дерева, если учесть дополнительную единицу черноты в вершине ж, и превращает его в настоящее красно-чёрное дерево. В цикле (строки 1-22) дерево меняется, и значение переменной ж тоже меняется (выделенная вершина может сдвигаться вверх по дереву), но сформулированное


свойство остаётся верным.

Цикл завершается, если (1) ж указывает на красную вершину (тогда мы в строке 23 красим её в чёрный цвет) или если (2) х указывает на корень (тогда лишняя чернота может быть просто удалена из дерева). Может оказаться также, что (3) внутри тела цикла удаётся выполнить несколько вращений и перекрасить несколько вершин, после чего дважды чёрная вершина исчезнет. В этом случае присваивание х <- root[T] позволяет выйти из цикла.

Внутри цикла х указывает на дважды чёрную вершину, не являющуюся корнем. В строке 2 мы определяем, каким ребёнком является х - левым или правым. (Подробно выписана часть процедуры для первого случая, второй случай симметричен и скрыт в строке 22.) Переменная w (строка 3) указывает на второго ребёнка вершины р[х] («брата» вершины ж). Так как вершина ж - дважды чёрная, w не может быть равно nil[T], поскольку в этом случае вдоль одного пути от р[х] вниз (через w) было бы меньше черных вершин, чем вдоль другого (через ж).

Четыре возможных случая показаны на рис. 14.7. Прежде чем разбираться с ними детально, посмотрим, как проверить, что преобразования не нарушают свойство 4. Достаточно убедиться, что количество чёрных вершин от корня показанного поддерева до каждого из поддеревьев а,(3,...,( не изменилось. Например, на рис. 14.7а, иллюстрирующем случай 1, количество чёрных вершин от корня до каждого из поддеревьев а и /3 равно 3 как до, так и после преобразования. (Напомним, что вершина ж считается за две.) Аналогично, количество чёрных вершин от корня до у, S, е и (, равно 2 до и после преобразования. На рис. 14.76 вершина В может быть и чёрной, и красной. Если она красная, то число чёрных вершин от корня до а (до и после преобразования) равно 2, если чёрная

-то 3. Остальные случаи проверяются аналогично (упр. 14.4-5). Итак, рассмотрим все случаи по порядку. Случай 1 (строки 5-8

процедуры RB-Delete-Fixup, рис. 14.7а) имеет место, когда вершина w, брат ж, красная (в этом случае их родитель, р[х], чёрный). Так как оба ребёнка вершины w чёрные, мы можем поменять цвета w и р[х] и произвести левое вращение вокруг р[х], не нарушая RB-свойств. Вершина ж остаётся дважды чёрной, а её новый брат

-чёрный, так что мы свели дело к одному из случаев 2, 3 или 4. Если вершина w чёрная, имеет место один из случаев 2-4. Они

различаются между собой цветом детей вершины w. В случае 2 (строки 10-11, рис. 14.76) оба ребёнка вершины w чёрные. Так как вершина w тоже чёрная, мы можем снять чёрную окраску с ж (лишнюю) new (сделав её красной), и добавить черноту родителю, р[х]. После этого продолжим выполнение цикла. Заметим, что если мы попали в случай 2 из случая 1, то вершина р[х] - красная, поэтому цикл сразу же завершится (добавив чёрного к красной вершине, мы красим её в обычный чёрный цвет).


В случае 3 (строки 13-16, рис. 14.7в) вершина w чёрная, её левый ребёнок - красный, а правый - чёрный. Мы можем поменять цвета w и её левого ребёнка и потом применить правое вращение так, что RB-свойства будут сохранены. Новым братом вершины ж теперь будет чёрная вершина с красным правым ребёнком, и мы свели случай 3 к случаю 4.

Наконец, в случае 4 (строки 17-21, рис. 17.4г) вершина w (брат вершины ж) является чёрной, а её правый ребёнок - красный. Меняя некоторые цвета и производя левое вращение вокруг р[х], мы можем удалить излишнюю черноту у ж, не нарушая RB-свойств. Присваивание ж <- root[T] выводит нас из цикла.

Каково время выполнения процедуры RB-Delete? Высота красно-чёрного дерева с га вершинами есть О (lgra), поэтому время исполнения RB-Delete без учёта RB-Delete-Fixup есть O(lgra). Сколько времени требует цикл в процедуре RB-Delete-Fixup? Как только обнаруживается случай 1, 3 или 4, мы выходим из цикла (при этом выполняется 0(1) операций и самое большее три вращения). До этого возможно несколько повторений случая 2, но при каждом повторении указатель ж перемещается вверх по дереву и никакие вращения не производятся, так что число таких шагов есть О (lgra). Таким образом, процедура RB-Delete-Fixup требует времени О (lgra), и общее время работы процедуры RB-Delete также есть О (lgra) (отметим ещё раз, что при этом производится не более трёх вращений).

Упражнения

14.4-1 Убедитесь, что после выполнения процедуры RB-Delete корень дерева остаётся чёрным, если он таковым был.

14.4-2 В упр. 14.3-3 построено красно-чёрное дерево, которое получается добавлением ключей 41,38,31,12,19,8 в пустое дерево. Нарисуйте деревья, которые получатся из него при последовательном удалении ключей 8,12,19, 31, 38,41.

14.4-3 В каких строках процедуры RB-Delete-Fixup мы можем читать или изменять фиктивный элемент nil[T]?

14.4-4 Упростите процедуру Left-Rotate, используя фиктивный элемент для представления nil и ещё один фиктивный элемент, содержащий указатель на корень дерева.

14.4-5 Для каждого из случаев на рисунке 14.7 подсчитайте количество чёрных вершин от корня поддерева на рисунке до каждого из поддеревьев а, (3,..., ( и убедитесь, что оно не меняется при преобразованиях. Используйте обозначение count(c) для «степени



[стр.Начало] [стр.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]