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


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




[266]

Graham-Scan(Q)

1пусть $р 0$ --- точка из множества $Q$ с наименьшей ординатой

(если таковых несколько --- самая левая)

2пусть $\langle р 1, р 2, ... p m \rangle$ --- остальные точки

множества $Q$, отсортированные в порядке возрастания полярного угла (против часовой стрелки) относительно точки $р 0$ Если есть несколько точек с одинаковым полярным углом, то оставляем только самую удал\"~~а5нную от $р 0$.

3сделать стек $S$ пустым

4$Push(S,p 0)$

5$Push(S,p l)$

6$Push(S,p 2)$

7\emph{for} $i\leftarrow 3 \emph{to} m$

8\emph{do while} при движении по ломаной

$Iext-To-Top(S) \rightarrow Top(S) \rightarrow p мы двигаемся прямо или направо

9\emph{do} $Pop(S)$

10$Push(S,p i)$

11\emph{return} $S$

На рисунке 35.7 показаны шаги выполнения алгоритма Graham-Scan. В строке 1 мы находим точку ро; все остальные точки множества Q находятся выше неё (или на одном уровне, но правее), и потому она заведомо ю входит в CH(Q). В строке 2 оставшиеся точки множества Q упорядочиваются полярному углу относительно точки ро- Каждое сравнение можно выполнить за время 0(1) с помощью произведений (упр. 35.1-2); из точек с одинаковым углом остаётся самая дальняя (остальные заведомо не принадлежат выпуклой оболочке). Полярный углы точек множества Q находятся в пределах промежутка [0, тг). Заметим, что точки pi и рт являются вершинами CH(Q) (упр. 35.3-1).

Затем (строки 3-6) мы помещаем в стек три первые точки Po,pi,P2, после чего можем утверждать, что стек содержит выпуклую оболочку множества po,Pi, • • • ,Pk ПРИ к = 2. Это свойство будет поддерживаться и в дальнейшем, а к будет расти, пока не станет равным то. При движении от дна стека к его вершине мы всё время поворачиваем налево. Если просто так добавить очередную точку в стек, мы нарушим это свойство, поэтому предварительно мы выбрасываем несколько верхних вершин стека.

Теорема 35.2 (алгоритм Грэхема правилен)

После исполнения процедуры Graham-Scan для множества точек Q, содержащего по меньшей мере три точки, в стеке S содержится выпуклая оболочка множества Q (в порядке обхода против часовой стрелки).

Доказательство.

По-настоящему строгое доказательство выходит за рамки книги


рисунок совпадает с 35.8 (Ь), только нет точки рг-, пунктирных линий poPiPj и серой области

35.8Если точки pi, ,Pk,Pj идут в порядке возрастания полярных углов (относительно точки ро), которые меняются в промежутке от [О, тг), и при движении по ломаной poPi • • -PkPj мы в каждой вершине поворачиваем налево, то выпуклой оболочкой точек ро, р\, , РкЛН будет многоугольник, вершинами которого будут все эти точки, а границей будет ломаная poPi • • -PkPjPo

[рисунок совпадает с 35.8 (а), только добавлено обозначение р\ для точки рядом с ро]

35.9Если точки р\,... ,Pk,Pj,Pi идут в порядке возрастания полярных углов (относительно точки ро), которые меняются в промежутке от [0, тг), и при движении по двум соседним участкам PkPjPi ломаной poPi • • - PkPjPi мы поворачиваем вправо или идём прямо, то выпуклая оболочка точек pi,... ,pk,Pj,Pi не изменится после удаления точки pj (поскольку она лежит внутри треугольника poPkPi)-

(строгое определение внутренности многоугольника- уже непростая задача), поэтому мы лишь укажем два наглядно очевидных факта, которые гарантируют правильность алгоритма; они показаны на рис. 35.8 и 35.9

ВНИМАНИЕ: ЗДЕСЬ НОВЫЕ РИСУНКИ!!!

Покажем теперь, что время работы алгоритма Graham-Scan есть О (га lgra), где га = \Q\. Сортировка укладывается в эти границы, если использовать сортировку слиянием или с помощью кучи. Остальная часть алгоритма требует времени О (га). Это не сразу очевидно, поскольку очередная итерация цикла for, помимо добавления одной новой точки, может потребовать удаления нескольких (и, возможно, многих) старых.

Тем не менее, методы амортизационного анализа позволяют легко доказать, что общее число действий есть О (га). В самом деле, любая точка рг- добавляется в стек S только один раз, а потому и удаляется не более одного раза. Тем самым общее время и на добавление, и на удаление есть О (га). (Аналогичное рассуждение мы использовали в разделе 18.1 при анализе процедуры Multipop.)

Проход Джарвиса

Проход Джарвиса вычисляет выпуклую оболочку множества точек Q при помощи «заворачивания» (package wrapping, gift wrapping). Алгоритм требует времени O(nh), где h - число вершин выпуклой оболочки. Поэтому, для класса задач, где h есть o(lgra), проход Джарвиса асимптотически быстрее просмотра Грэхема.

Идея алгоритма такова: мы хотим обвязать наши гвозди верёвкой. Конец верёвки прикрепим к нижнему гвоздю ро (которая выбирается как и в предыдущем алгоритме), и пустим верёвку вправо. Затем будем поднимать правый конец верёвки,


пока она не коснётся некоторого гвоздя р\. Дальше мы вращаем верёвку уже относительно pi, пока она не коснётся следуюёщего гвоздя р2- Так продолжается, пока верёвка не дойдёт до исходной точки ро-

Более формально, последовательность точек Н = (po,pi,... ,Ph~ 1), являющихся вершинами CH(Q), строится так. Мы начинаем с точки ро. Следующая точка р\ имеет наименьший (среди всех точек множества Q) полярный угол относительно ро (см. рис. 35.10) (Если таковых несколько, выбираем самую далёкую.) Затем мы, стоя в точке pi, сравниваем полярные углы всех точек и выбираем точку р2 с наименьшим полярным углом (относительно pi), и так далее. В какой-то момент мы дойдём до верхней точки (точки с наибольшей ординатой), после чего процесс продолжится, только теперь надо отсчитывать полярные углы от луча, направленного влево, а не вправо. Тем самым мы построим сначала (до верхней точки) правую цепь (right chain) выпуклой оболочки, а затем левую цепь (рис. 35.10)

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

При естественной реализации проход Джарвиса выполняется за время O(nh). Для каждой вершины h выпуклой оболочки CH(Q) мы ищем вершину с минимальным полярным углом. Каждое сравнение углов выполняется за время 0(1) (при этом можно обойтись без тригонометрии, использовав приёмы разд. 35.1), так что поиск минимума требует времени 0(п) (разд. 10.1). Общее время, будет, таким образом, О(nh).

Упражнения

35.3-1

Докажите, что точки р\ и рт в процедуре Graham-Scan окажутся вершинами CH(Q). 35.3-2

Будем считать, что сложение, умножение и сравнение выполняются за время 0(1). Покажите, что если мы умеем находить выпуклую оболочку п точек (вершины которой требуется указать в порядке обхода против часовой стрелки) быстрее чем за (га lgra) шагов, то можно отсортировать п чисел быстрее чем за fi(ralgra) шагов.

35.3-3

В множестве точек 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]