Пусть есть n магазинов xj, заданных своими координатами. Выделим для каждого из них зону обслуживания, предполагая, что покупатели ходят в ближайший магазин. Тогда зоны обслуживания суть множества , называемые клетками Дирихле или многоугольниками Вороного. Совокупность всех таких многоугольников называется диаграммой Вороного. Магазины назовем соседними, если их многоугольники имеют общий участок границы. У нас соседями будут пары: (1,2), (1,4), (2,3), (2,4), (3,4). Соединив все пары соседних вершин ребрами, получим граф Делоне. Он задает наилучшую триангуляцию карты (минимальный угол в триангуляции Делоне - наибольший по всем триангуляциям). Число ребер в диаграмме и в графе Делоне считается по формуле 3·(n-1)-G, где G – число точек, лежащих на границе выпуклой оболочки. Диаграмма строится рекурсивно методом “разделяй и властвуй” за O(n·log n) операций (т.к. ):
1. Найдем медиану среди первых координат точек и разобьем точки на два равных подмножества L и R, выпуклые оболочки conv(L) и conv(R) которых не пересекаются.
2. Построим диаграммы Вороного ДВ(L) и ДВ(R) для каждого из подмножеств.
3. По ДВ(L) и ДВ(R) за линейное время построим conv(L) и conv(R), и выполнив шаг 3 алгоритма Грэхема (см. ниже) – границу conv(X). На ней найдем два опорных отрезка (верхний и нижний), концы которых лежат в разных множествах L и R.
4. Построим ломаную B, каждая точка z которой равноудалена от ближайших к z в множествах L и R точек l=l(z) и r=r(z). Двигаясь вверх по срединному перпендикуляру к текущему отрезку (начиная с нижнего опорного) до первой точки пересечения с отрезком одной из диаграмм, мы попадем в зону близости другой точки этой диаграммы Þ меняем l или r. Дойдя до верхнего опорного отрезка, завершим построение ломаной B.
5. Склеим две диаграммы в одну, удалив все части диаграммы ДВ(L), расположенные справа от ломаной B, и все части диаграммы ДВ(R), расположенные слева от B.
Пример: L = {1,2,4}, R = {3,5,6}.
Опорные отрезки – (1,6) и (2,5).
текущие |
l |
1 |
4 |
4 |
2 |
2 |
отрезки |
r |
6 |
6 |
3 |
3 |
5 |
Диаграмма Вороного полезна при решении многих оптимизационных задач на плоскости и ее построение выносится в предобработку. Она задает топологию на конечных множествах в Â2.
№6. ПОСТРОЕНИЕ ВЫПУКЛОЙ ОБОЛОЧКИ В Â2.
Алгоритм Грехема. На входе - множество X={xi}, состоящее из n точек плоскости.
1) Выберем внутреннюю точку O (например, центр тяжести любых 3-х точек).
2) Упорядочим полярные углы из O на точки xi и перенумеруем точки.
3) В цикле для тройки (l,k,r) проверим, лежит ли точка k внутри conv(O,l,r), где l=L(k), r=R(k), т.е. l и r- соседи слева и справа от k по оставшимся углам. Если лежит, то удаляем k {L(r)=l, R(l)=r} и делаем шаг назад {k=r, r=R(r)}, проверяя rÏconv(O,l,R(r)). Если же нет, то идем вперед: {r=k, k=l, l=L(l)}. Цикл идет до тех пор, пока некоторая тройка не повторится.
Суммарное число шагов вперед < 2n, шагов назад < n. А общая трудоемкость алгоритма определяется на шаге 2 и равна O(n·log n).
Пример:Выберем точку О как центр тяжести любых трех точек исходного множества точек. Упорядочим точки по полярному углу из точки О. Выполним шаг 3 алгоритма:
тройка (2,1,6) - 1 лежит справа от отрезка [2,6] Þ 2 не принадлежит выпуклой оболочке Þ идем вперед. Результат занесем в таблицу (цикл по средней точке от 1 до n и замыкаем на 1 до повтора тройки ???):
тройка |
2,1,6 |
3,2,1 |
3,1,6 |
4,3,1 |
5,4,3 |
6,5,4 |
1,6,5 |
1,5,4 |
3,1,5 |
3,5,4 |
4,3,5 |
5,4,3 |
команда |
вперед |
назад |
вперед |
вперед |
вперед |
вперед |
назад |
вперед |
назад |
вперед |
вперед |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.