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


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




[96]

Для примера посмотрим, как процедура ищет в дереве на рис. 15.4 отрезок, перекрывающийся с отрезком г = [22,25]. Мы начинаем с корня (ж = root[T]), который хранит отрезок [16,21], не перекрывающийся с г. Так как max[left[x]] = 23, что больше, чем low[i] = 22, то мы переходим к левому ребёнку корня (ж <- left[x]). Этот ребёнок хранит отрезок [8,9], также не перекрывающийся с г. На этот раз max[left[x]] = 10 меньше low[i] = 22, поэтому мы переходим к правому ребёнку вершины ж. Там находится отрезок [15,23], перекрывающийся с г, и поиск завершается.

Рассмотрим пример безрезультатного поиска в том же дереве - будем искать отрезок, перекрывающийся с г = [11,14]. Снова начинаем с корня. Корень хранит отрезок [16, 21], не перекрывающийся с г. Так как max[left[x]] = 23 больше low[i] = 11, переходим к левому ребёнку. Теперь в ж хранится отрезок [8,9]. Он не перекрывается с г, и max[left[x]] = 10 меньше low[i] = 11, поэтому идём направо. (Слева искомого отрезка быть не может). В ж теперь хранится [15,23], с г этот отрезок не перекрывается, left[x] = nil, поэтому идём направо и возвращаем значение nil.

Корректность процедуры Interval-Search устанавливает теорема 15.2, которая утверждает, что если отрезки int[x] и г не перекрываются, то дальнейший поиск идёт в правильном направлении (если нужные отрезки вообще есть в дереве, то они есть и в выбираемой части дерева). Поэтому нам достаточно просмотреть всего один путь. (Обратите внимание, что слова «правильное направление» не означают, что в другом направлении искомых отрезков нет: мы утверждаем лишь, что если они есть вообще, то есть и в «правильном» направлении!)

Теорема 15.2. Пусть ж - произвольная вершина дерева, г - отрезок, не перекрывающийся с int[x], и мы выполняем строки 3-5 процедуры Interval-Search (Г, г). Тогда:

1.Если выполняется строка Jh то либо поддерево с корнем left[x] (левое поддерево) содержит отрезок, перекрывающийся с г, либо поддерево с корнем right[x] (правое поддерево) не содержит отрезка, перекрывающегося с г.

2.Если выполняется строка 5, то левое поддерево не содержит отрезка, перекрывающегося с г.

Доказательство. Начнём с более простого случая 2. Строка 5 выполняется, если не выполнено условие в строке 3, то есть если left[x] = nil или max[left[x]] < /ою[г]. В первом случае левое поддерево пусто, поэтому не содержит отрезка, перекрывающегося с г. Предположим, что left[x] ф nil и max[left[x]] < /огф]. Рассмотрим произвольный отрезок г из левого поддерева (см. рис. 15.5а). Так как max[left[x]] - наибольший правый конец таких отрезков, то

high[i] max[left[i]] < /огф],


Рис. 15.5 Отрезки в доказательстве теоремы 15.2. Пунктиром показано значение max[left[x]]. (а) Случай 2: мы идем направо. Никакой интервал г не перекрывается с г. (б) Случай 1: мы идем налево. Выберем в левом поддереве отрезок г , для которого high[i] = max[left[x]] 1ою[г]. Тогда либо г перекрывается с г, либо г лежит целиком справа от г, и г не перекрывается ни с каким отрезком г" из правого поддерева, потому что low[i] low[i"].

поэтому отрезок г целиком лежит левее отрезка г. Случай 2 рассмотрен.

Рассмотрим теперь случай 1. Предположим, что в левом поддереве нет отрезков, перекрывающихся с г. Тогда нужно доказать, что таких отрезков нет и в правом. Так как выполняется строка 4, то условие в строке 3 выполнено, и max[left[x]] /ою[г]. Поэтому в левом поддереве найдётся отрезок г7, для которого

high[i] = max[left[i]] low[i]

(см. рис. 15.56). Но отрезки г и г7 не перекрываются (по предположению - мы считаем, что в левом поддереве нет отрезков, перекрывающихся с г). Это означает, что отрезок г1 лежит целиком справа от г (целиком слева он лежать не может), то есть high[i] < low[i]. В дереве Г выполнено свойство упорядоченности левых концов, поэтому и все отрезки правого поддерева лежат целиком справа от г: для произвольного отрезка г" из правого поддерева выполнено

high[i] < /ою[г7] low[i"].

Упражнения

15.3-1 Напишите процедуру Left-Rotate для дерева промежутков, которая обновляет поля max за время 0(1).

15.3-2 Перепишите процедуру Interval-Search для случая, когда в дереве промежутков хранятся не отрезки, а интервалы (то есть нас интересуют перекрытия ненулевой длины).

15.3-3 Постройте алгоритм, который по заданному отрезку возвращает перекрывающийся с ним отрезок с минимальным левым концом (или константу nil, если таких отрезков нет).


Задачи к главе 15

299

15.3-4 Напишите программу, которая по заданному отрезку г и дереву промежутков Г возвращает список всех отрезков дерева Г, перекрывающихся с г. Время работы должно быть О (min (га, k log га)), где к - число элементов возвращаемого списка. (Дополнительный вопрос: как сделать это, не меняя дерева?)

15.3-5 Какие надо внести изменения в определение дерева промежутков, чтобы дополнительно реализовать процедуру Interval-Search-Exactly (Г, г), которая либо возвращает вершину х дерева Г, для которой /огфп£[ж]] = low[i] и high[int[x]] = high[i], либо выдаёт константу nil, если таких вершин нет (ищет отрезок, равный г, а не просто перекрывающийся с г.) Время работы процедуры Interval-Search-Exactly, а также всех прежних процедур промежутков должно оставаться равным О (log га).

15.3-6 Рассмотрим множество Q натуральных чисел. Определим Min-Gap как расстояние между двумя ближайшими числами в Q. Например, если Q = {1, 5, 9,15,18, 22}, то Min-Gap(Q) равно 18 -15 = 3. Реализуйте структуру данных, эффективно реализующую добавление, удаление и поиск элемента, а также операцию Min-Gap. Каково время работы этих операций?

15.3-7* При разработке интегральных схем информация часто представляется в виде списка прямоугольников. Пусть даны га прямоугольников со сторонами, параллельными осям координат. Каждый прямоугольник задаётся четырьмя числами: координатами левого нижнего и правого верхнего углов. Написать программу, которая за время О (га log га) выясняет, есть ли среди этих прямоугольников два перекрывающихся (но не требуется найти все перекрывающиеся прямоугольники). Обратите внимание, что границы перекрывающихся прямоугольников могут не пересекаться, если один лежит внутри другого. (Указание. Двигаем горизонтальную прямую снизу вверх и смотрим, как меняется её пересечение с прямоугольниками.)

Задачи

15-1 Точка максимальной кратности

Мы хотим следить за точкой максимальной кратности (point of maximum overlap) множества промежутков - точкой, которая принадлежит максимальному числу промежутков из этого множества. Как нам обновлять информацию об этой точке при добавлении и удалении элемента?



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