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


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




[94]

вершины х, за время О (log га)?

15.1-6 Заметим, что процедуры OS-Select и OS-Rank используют поле size только для того, чтобы узнать порядковый номер вершины х в поддереве с корнем х. Предположим, что мы храним в вершине вместо поля size этот порядковый номер. Как обновлять эту информацию при добавлении и удалении элемента? (Напомним, что добавление и удаление сопровождаются вращениями.)

15.1-7 Как, используя порядковые деревья, посчитать число инверсий (см. задачу 1-3) в массиве размера га за время O(ralogra)?

15.1-8* Рассмотрим га хорд окружности, заданных своими концами (считаем, что все 2га концевых точек различны). Придумайте алгоритм, который за время О (га lgra) определяет, сколько пар хорд пересекаются внутри круга. (Например, если все хорды - диаметры, то ответом будет С2.)

15.2. Общая схема работы с дополнительной информацией

Ситуация, когда требуется пополнить какую-либо стандартную структуру данных дополнительной информацией, довольно типична. Мы встретимся с ней снова в следующем разделе. А в этом разделе мы докажем общую теорему, облегчающую этот процесс в случае красно-чёрных деревьев.

Пополнение структуры данных делится на четыре шага:

1.выбираем базовую структуру данных;

2.решаем, какую дополнительную информацию мы будем хранить (и обновлять);

3.проверяем, что эту информацию удаётся обновлять при выполнении операций, допустимых для выбранной структуры данных;

4.реализуем новые операции.

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

Давайте посмотрим на конструкции раздела 15.1 с точки зрения этих правил.

На шаге 1 мы выбрали красно-чёрные деревья в качестве базовой структуры.

На шаге 2 мы решили добавить к каждой вершине поле size. Смысл хранения дополнительной информации состоит в том, что она позволяет выполнять некоторые операции быстрее. Без поля size мы не смогли бы выполнить операции OS-Select и OS-Rank


за время О (log га). (Несколько иной вариант выбора дополнительной информации дан в упр. 15.2-1.)

На шаге 3 мы убедились, что обновление полей size при добавлении и удалении элементов можно выполнить без ухудшения асимптотики для времени добавления и удаления. В этом смысле наш выбор удачен: если бы, скажем, мы решили хранить для каждой вершины её порядковый номер, то процедуры OS-Select и OS-Rank работали бы быстро, но добавление нового элемента повлекло бы за собой изменение дополнительной информации во многих вершинах дерева (во всех, если добавленный элемент минимален). Наш выбор (поле size) даёт удачный компромисс между лёгкостью использования и обновления.

На шаге 4 мы реализовали процедуры OS-Select и OS-Rank, из-за которых мы, собственно, и затевали всё это дело.

Впрочем, в других ситуациях (упр. 15.2-1) дополнительная информация используется не для реализации новых операций, а для ускорения уже имеющихся.

Дополнительная информация для красно-чёрных деревьев

Следующая теорема показывает, что для красно-чёрных деревьев информацию определённого вида можно обновлять, не замедляя (асимптотически) операции добавления и удаления. Её доказательство во многом повторяет рассуждения из раздела 15.1.

Теорема 15.1 (Пополнение красно-чёрного дерева). Рассмотрим дополнительный атрибут f, определённый для вершин красно-чёрных деревьев. Предположим, что для всякой вершины х значение f[x] полностью задаётся остальной информацией, хранящейся в вершинах х, left[x] и right[x] (в том числе значениями f[left[x]] и f[right[x]]), и его вычисление по этим данным требует времени 0(1). Тогда поля f можно обновлять при добавлении и удалении элемента из дерева, не ухудшая (асимптотически) время выполнения добавления и удаления.

Доказательство. Идея доказательства состоит в том, что изменение поля / в некоторой вершине х повлечёт за собой изменения поля / только в вершинах, расположенных на пути из корня в х. В самом деле, изменение f[x] повлечёт за собой изменение что в свою очередь изменити т.д., но другие вершины

останутся нетронутыми. От /[гоо/[Г]] не зависит значение поля / в других вершинах, и процесс изменений остановится. Так как высота дерева равна О (log га), то после изменения поля f[x] для какой-то одной вершины х мы сможем обновить все необходимые поля за время О (log га).

Добавление элемента х в дерево Г делается в два этапа (см. разд. 14.3). На первом этапе вершину х добавляют в качестве


ребёнка уже существующей вершины р[х]. Значение f[x] вычисляется за время 0(1), так как новая вершина - лист (точнее, её дети - nil-листья). Далее происходит О (lgra) изменений полей на пути к корню. Итак, первый этап занимает время О (log га). На втором этапе мы выполняем вращения (самое большее два); после каждого потребуется О (lgra) операций для распространения изменений вверх по дереву.

Удаление также проводится в два этапа (см. разд. 14.4). На первом этапе изменения возникают, если удаляемая вершина заменяется её последователем, а также когда мы выбрасываем удаляемую вершину или её последователя. И в том и в другом случае мы изменяем поле / у одной вершины, поэтому обновление всех полей займет время О (log га). На втором этапе мы делаем самое большее три вращения, каждое из которых требует времени O(logra) для обновления полей на пути к корню.□

Во многих случаях (в частности, для поля size) при вращениях все поля можно обновить за время 0(1), а не О (log га). Такая ситуация возникает в упр. 15.2-4.

Упражнения

15.2-1 Пополнить порядковое дерево (не ухудшив асимптотически время операций) так, чтобы минимальный и максимальный элементы, а также предшественник и последователь данного элемента отыскивались бы за время 0(1).

15.2-2 Будем хранить в каждой вершине красно-чёрного дерева её чёрную высоту. Возможно ли обновлять это поле при добавлении и удалении элемента из дерева, не ухудшив (асимптотически) время работы этих операций?

15.2-3 Будем хранить в вершине её глубину. Возможно ли обновлять это поле при добавлении и удалении элемента из дерева, не ухудшив (асимптотически) время работы этих операций?

15.2-4* Пусть <g> - ассоциативная бинарная операция на некотором множестве М, и пусть в каждой вершине красно-чёрного дерева хранится некоторый элемент а множества М (свой в каждой вершине). Пусть теперь мы хотим хранить в каждой вершине х поле f[x] = a[xi]<S>a[x2] <S> • • -® а[жт], где х\, Х2, , хт - все вершины поддерева с корнем х (в порядке возрастания ключей). Показать, что поле / при вращениях можно обновлять за время 0(1). Провести аналогичное рассуждение для поля size.

15.2-5* Мы хотим реализовать для красно-чёрных деревьев операцию RB-enumerate(a;, а, Ь), которая выдаёт список всех вершин



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