4551
правка
Irina (обсуждение | вклад) |
Irina (обсуждение | вклад) |
||
Строка 22: | Строка 22: | ||
== Основные результаты == | == Основные результаты == | ||
На базе терминологии, данной в работе [ ], определим свойство единственности следующим образом. | На базе терминологии, данной в работе [3], определим [[свойство единственности]] следующим образом. | ||
Определение 2. Пусть имеется точка s; область R обладает свойством единственности относительно s, если для каждой пары точек p | '''Определение 2'''. Пусть имеется точка s; область R обладает свойством единственности относительно s, если для каждой пары точек <math>p, q \in R \;</math>, ||pq|| < max(||sp||, ||sq||). Разбиение пространства на конечном множество непересекающихся областей обладает свойством единственности относительно s, если каждая из этих областей обладает свойством единственности относительно s. | ||
Нотация ||sp|| используется для представления расстояния между s и p согласно метрике L1. Определим восьмиугольное разбиение плоскости относительно точки s как разбиение, порожденное двумя прямыми линиями под углом 90 градусов и двумя прямыми под углом 45 градусов к ним, как показано на рис. 2a. Здесь каждая из областей, от | Нотация ||sp|| используется для представления расстояния между s и p согласно метрике L1. Определим ''восьмиугольное разбиение'' плоскости относительно точки s как разбиение, порожденное двумя прямыми линиями под углом 90 градусов и двумя прямыми под углом 45 градусов к ним, как показано на рис. 2a. Здесь каждая из областей, от <math>R_1 \;</math> до <math>R_8 \;</math>, включает только одну из ограничивающих ее полупрямых, как можно видеть на рис. 2b. Можно показать, что восьмиугольное разбиение обладает свойством единственности. | ||
Лемма 1. Пусть имеется точка s на плоскости. Восьмиугольное разбиение относительно s обладает свойством единственности. | '''Лемма 1. Пусть имеется точка s на плоскости. Восьмиугольное разбиение относительно s обладает свойством единственности.''' | ||
Доказательство. Чтобы показать, что разбиение обладает свойством единственности, необходимо доказать, что каждая область разбиения обладает этим свойством. Поскольку области | Доказательство. Чтобы показать, что разбиение обладает свойством единственности, необходимо доказать, что каждая область разбиения обладает этим свойством. Поскольку области <math>R_1 - R_8 \;</math> аналогичны друг другу, достаточно будет доказать это для области <math>R_1 \;</math>. | ||
Точки в области | Точки в области <math>R_1 \;</math> можно охарактеризовать следующими неравенствами | ||
x | <math>x \ge x_s; x - y < x_s - y_s \;</math> | ||
Предположим, что имеются точки p и q в | |||
||sq|| = ||sp|| + ||pq|| > ||pq||. Следовательно, необходимо рассмотреть только случай yp > yq. В данном случае | |||
||pq|| = \xp-xq\ + \yp- yqj = xq-xp + yp-yq = (xq - yq) + yp - xp < (xs - ys) + yp – xs = yP-ys <xp-xs + yp-ys | Предположим, что имеются точки p и q в <math>R_1 \;</math>. Без потери общности будем считать, что xp < xq. Если yp < yq, то ||sq|| = ||sp|| + ||pq|| > ||pq||. Следовательно, необходимо рассмотреть только случай yp > yq. В данном случае ||pq|| = \xp-xq\ + \yp- yqj = xq-xp + yp-yq = (xq - yq) + yp - xp < (xs - ys) + yp – xs = yP-ys <xp-xs + yp-ys | ||
□ | □ | ||
Строка 50: | Строка 50: | ||
Пусть даны две точки p, q в одном и том же сегменте (октанте) восьмиугольного разбиения плоскости относительно точки s. Согласно свойству единственности, ||pq|| < max(||sp||; ||sq||). Рассмотрим цикл с точками s, p и q. Согласно свойству циклов, только одну точку с минимальным расстоянием до s необходимо соединить с s. Интересное свойство восьмиугольного разбиения заключается в том, что контур равноудаленных от s точек формирует отрезок прямой в каждой области. В областях | Пусть даны две точки p, q в одном и том же сегменте (октанте) восьмиугольного разбиения плоскости относительно точки s. Согласно свойству единственности, ||pq|| < max(||sp||; ||sq||). Рассмотрим цикл с точками s, p и q. Согласно свойству циклов, только одну точку с минимальным расстоянием до s необходимо соединить с s. Интересное свойство восьмиугольного разбиения заключается в том, что контур равноудаленных от s точек формирует отрезок прямой в каждой области. В областях <math>R_1, R_2, R_5, R_6 \;</math> эти сегменты описываются уравнением вида x + y = c; в областях <math>R_3, R_4, R_7, R_8 \;</math> – уравнением вида x - y = c. | ||
Для каждой точки s необходимо найти ближайшего к ней соседа в каждом октанте. Опишем, как эффективно вычислить соседей в октанте | Для каждой точки s необходимо найти ближайшего к ней соседа в каждом октанте. Опишем, как эффективно вычислить соседей в октанте <math>R_1 \;</math> для всех точек. Случаи остальных октантов симметричны. Для октанта <math>R_1 \;</math> алгоритм с заметающей прямой исполняется для всех точек в порядке неубывания x + y. В процессе заметания поддерживается активное множество, состоящее из точек, для которых ближайшие соседи в <math>R_1 \;</math> еще не найдены. После обработки точки p будут найдены все точки активного множества, содержащие p в их областях <math>R_1 \;</math>. Если такая точка содержится в активном множестве, то, поскольку точки проверяются в порядке неубывания x + y, p должна быть ближайшей точкой для s в <math>R_1 \;</math>. | ||
Строка 59: | Строка 59: | ||
Фундаментальной операцией алгоритма с заметающей прямой является нахождение подмножества активных точек, такого, что заданная точка p принадлежит к их областям | Фундаментальной операцией алгоритма с заметающей прямой является нахождение подмножества активных точек, такого, что заданная точка p принадлежит к их областям <math>R_1 \;</math>. Основываясь на наблюдении, что точка p принадлежит к области <math>R_1 \;</math> точки s в том и только том случае, если s принадлежит к области <math>R_5 \;</math> точки p, необходимо найти подмножество активных точек в области <math>R_5 \;</math> точки p. Поскольку область <math>R_5 \;</math> может быть представлена как двумерный диапазон (00,xp] x (xp - yp;+1) на (x, x - y), для поддержки множества активных точек можно использовать дерево поиска с приоритетами [ ]. Поскольку каждая операция вставки и удаления требует O(log n) времени, а операция запроса – O(log n+ k) времени, где k – количество объектов в диапазоне, общее время работы алгоритма с заметающей прямой составит O(nlogn). Другие области могут быть обработаны аналогично <math>R_1 \;</math>, так что полное время работы алгоритма составит O(n log n). Дерево поиска с приоритетами – это структура данных, поддерживающая сбалансированность ради быстрого осуществления поиска. Она отлично работает для статических входных множеств. Если входное множество оказывается динамическим, перебалансировка дерева может представлять серьезную проблему. К счастью, активное множество имеет структуру, которая допускает альтернативное представление. Поскольку точка удаляется из активного множества, если найдена точка в ее области <math>R_1 \;</math>, никакая точка активного множества не может принадлежать к области <math>R_1 \;</math> другой точки множества. | ||
Строка 69: | Строка 69: | ||
Чтобы найти подмножество активных точек, для которых s находится в их областях | Чтобы найти подмножество активных точек, для которых s находится в их областях <math>R_1 \;</math>, вначале необходимо найти наибольшее x, такое, что x < xs, а затем выполнять обработку в порядке убывания x, до тех пор, пока x - y > xs - ys. Поскольку упорядочение производится только по одному измерению, использование любого бинарного дерева поиска со стоимостью операций вставки, деления и запроса, равной O(log n), получаем алгоритм с временем исполнения O(n log n). Бинарные деревья запроса также требуют балансировки. Кроме того, можно использовать списки с пропусками [ ], использующие рандомизацию во избежание проблемы явной балансировки, но демонстрирующие ожидаемое поведение на уровне O(log n). | ||
Внимательное рассмотрение также позволяет прийти к выводу, что после заметания области | Внимательное рассмотрение также позволяет прийти к выводу, что после заметания области <math>R_1 \;</math> нет необходимости в заметании <math>R_5 \;</math>, поскольку все ребра, необходимые на данном этапе, уже подключены или предполагаются. Более того, основываясь на информации из <math>R_5 \;</math>, количество реберных соединений можно еще больше сократить. Во время обработки заметающим процессом точки s он находит подмножество активных точек, содержащих s в их областях <math>R_1 \;</math>. Без потери общности будем считать, что к ним относятся точки p и q. Тогда p и q принадлежат к области R5 точки s, что означает ||pq|| < max(||sp||; ||sq||). Следовательно, необходимо только соединить s с ближайшей активной точкой. | ||
<math>R_1 \;</math> и <math>R_2 \;</math> имеют одну и ту же последовательность заметания и в силу этого могут быть обработаны вместе за один проход алгоритма. Аналогично, области <math>R_3 \;</math> и <math>R_4 \;</math> могут быть обработаны вместе за второй проход. На основе вышеприведенных рассуждений составим псевдокод алгоритма, представленный на рис. 2. | |||
Строка 98: | Строка 98: | ||
За время работы алгоритма каждая точка будет добавлена в активное множество и удалена из него только один раз для каждой из областей | За время работы алгоритма каждая точка будет добавлена в активное множество и удалена из него только один раз для каждой из областей <math>R_1 - R_4 \;</math>. Каждая операция вставки и удаления требует O(log n) времени. Таким образом, верхняя граница временной сложности алгоритма O(n log n). Хранить необходимо только активные множества, так что объем памяти для хранения не превышает O(n). □ | ||
== Применение == | == Применение == |
правка