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


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




[265]

пользованной нами операции с красно-чёрным деревом). Заметим, что для одной пары отрезков выяснение того, пересекаются они или нет, выполняется за время 0(1).

Упражнения.

35.2-1

Показать, что га отрезков могут иметь 0(га2) точек пересечения. 35.2-2

Даны два непересекающихся отрезка а и Ь, сравнимых относительно х. Используя векторное произведение, определить за время 0(1), выполнено ли соотношение а >х Ь.

35.2-3

Профессор предлагает изменить программу Any-Segment-Intersect так: найдя пересекающиеся отрезки, алгоритм не кончает работу, а продолжает выполнять цикл for. Получившийся алгоритм профессор называет Print-Intersecting-Segments и утверждает, что такой алгоритм напечатает все пересечения отрезков множества в порядке возрастания их абсцисс. Покажите, что профессор дважды неправ: во-первых, алгоритм может напечатать не все отрезки; во-вторых, первая напечатанная им точка может не быть самой левой точкой пересечения.

35.2-4

Постройте алгоритм, который за время О(гаlgra) определяет, имеет ли данная замкнутая га-звенная ломаная самопересечения. 35.2-5

Известно, что два несамопересекающиеся ломаные имеют в сумме га вершин. Постройте алгоритм, который за время О (га lgra) определяет, пересекаются ли они друг с другом.

35.2-6

Даны га кругов, заданных своими центрами и радиусами. Как определить за время О (га lgra), есть ли среди них два пересекающихся (то есть имеющих общую точку)?

35.2-7

Для набора из га отрезков имеется к точек пересечения. За время 0((га + к) lg га) найти все точки пересечения. 35.2-8

Показать, как модифицировать алгоритм Any-Segment-Intersect, чтобы он правильно работал для любого набора отрезков (в том числе и вертикальных; в некоторых точка может пересекаться более двух отрезков).

35.3. Построение выпуклой оболочки

Выпуклой оболочкой (convex hull) конечного множества точек Q называется наименьший выпуклый многоугольник, содержащий


35.6 Выпуклая оболочка CH(Q) множества Q (серый многоугольник)

все точки из Q (некоторые из точек могут быть внутри многоугольника, некоторые - на его сторонах, а некоторые будут его вершинами). Выпуклую оболочку множества Q мы будем обозначать CH(Q). Наглядно можно представлять себе дело так: в точках Q вбиты гвозди, на которые натянута резинка, охватывающая их все - эта резинка и будет выпуклой оболочкой множества гвоздей (рис. 35.6)

В данном разделе мы рассмотрим два алгоритма отыскания выпуклой оболочки множества из га точек; результатом их работы будет список вершин выпуклой оболочки (в порядке обхода против часовой стрелки). Первый из алгоритмов (просмотр Грэхема) требует времени О (га lgra). Второй (проход Джарвиса) выполняется за время О (га/г), где h - число вершин выпуклой оболочки. Как подсказывает рис. 35.6, каждая вершина многоугольника CH(Q) является одной из точек множества Q. Таким образом, для отыскания CH(Q) алгоритм должен решить, какие вершины из Q оставить, а какие - отбросить.

Оба рассматриваемых нами алгоритма (просмотром Грэхема и проход Джарвиса) используют метод «вращающегося луча» (rotational sweep): выбирается полярная системы координат, и точки обрабатываются в порядке возрастания полярных углов (как во вращающемся радаре). Но существуют и другие методы поиска выпуклой оболочки за время О (га lgra); вот некоторые возможности.

Метод добавления точек (incremental method) рассматривает точки слева направо, располагая из в последовательность (pi,р2,Рп) в порядке возрастания абсцисс. На г-ом шаге строится выпуклая оболочка СН (р\, р2,..., pi) первых г точек (к уже известной оболочке первых г - 1 точек добавляется точка рЛ. Эту идею можно превратить в алгоритм, находящий выпуклую оболочку за время О (га lgra) (упр. 35.3-6).

Метод разделяй и властвуй (divide-and-conquer method) за время О (га) делит множество из га точек вертикальной прямой на два примерно равных подмножества, затем рекурсивно ищет выпуклую оболочку каждого из них, а затем объединяет две эти оболочки за время О (га).

Метод стрижки и поиска (prune-and-search method) напоминает алгоритм поиска медианы в упорядоченном множестве за линейное время (раздел 10.3). Он находит «верхнюю цепочку» выпуклой оболочки, повторно отбрасывая некоторую фиксированную долю вершин, пока не останутся только вершины из верхней цепочки. Аналогичным образом ищется нижняя цепочка. Асимптотически


35.7

Работа процедуры textscGraham-Scan для множества Q (рис. 35.6). Для каждого из шагов текущее содержимое стека S показано серым.

(a)Точки (pi,p2, Рт) отсортированы по полярному углу относительно ро! в стеке - первые три точки (po,pi,p2).

(b)- (к) Стек S после очередной итерации цикла for ( строки 7 -10 ). Пунктирными линиями показаны повороты, которые не являются левыми; в этом случае вершина угла поворота удаляется из стека. Например, на этапе (h) из стека сначала удаляется точка ps (правый поворот pipgpg), а затем точка р? (правый поворот РбР7Рэ)-

(1) Результат работы алгоритма - выпуклая оболочка - совпадает с приведённой на рис. 35.6.

этот метод - самый быстрый из известных: если выпуклая оболочка содержит h вершин, то требуется время O(nlgh).

Вычисление выпуклой оболочки важно не только само по себе, но и как промежуточный этап для многих задач вычислительной геометрии. Рассмотрим, например, двумерную задачу о наиболее удалённых точках (farthest-pair problem): дано множество из га точек на плоскости; нужно выбрать пару максимально удалённых друг от друга точек. Можно доказать, что эти точки будут вершинами выпуклой оболочки (упр. 35.3-3); для выпуклого га-угольника можно найти две наиболее удалённые вершины за время О (га) (идея: зажимаем его между двумя параллельными прямыми и вращаем). Тем самым можно найти две наиболее удалённые (из га) точек за время О (га lgra).

Просмотр Грэхема

Просмотр Грэхема использует стек S, в котором хранятся точки, являющиеся кандидатами в выпуклую оболочку. Каждая точка исходного множества Q в некоторый момент помещается в стек; если она не является вершиной выпуклой оболочки CH(Q), то через некоторое время точка будет удалена из стека, а если является - то останется. В момент окончания работы алгоритма в стеке S находятся в точности все вершины выпуклой оболочки CH(Q) в порядке обхода против часовой стрелки.

Исходными данными для Graham-Scan является множество Q из (не менее чем трёх) точекг. Процедура используем функцию Top (S), которая возвращает точку, находящуюся в вершине стека S (не меняя содержимого стека), а также функцию Next-To-Top (S), которая возвращает следующий за вершиной элемент стека, также не меняя содержимого. Мы докажем, что по окончании работы в стеке (от дна к вершине) идут как раз вершины CH(Q) (в порядке обхода против часовой стрелки).



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