1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8

# конспект · шаг 8 из 8

Конспект: локализация, kd-дерево и диаграмма Вороного

выжимка - её можно унести в заметки

Понятия

Локализация точки - по разбиению плоскости и точке назвать область; ответ - отрезок прямо под точкой.

Полоса - часть плоскости между соседними вертикалями через концы отрезков; внутри неё отрезки не кончаются и упорядочены по высоте.

Трапецоидная карта - разбиение на трапеции вертикалями из концов до ближайших отрезков; с графом поиска при случайном порядке вставки.

kd-дерево - разрезы медианой по координатам по очереди. Проклятие размерности - в больших размерностях отсечение перестаёт работать.

Диаграмма Вороного - ячейки ближайших точек. Береговая линия - нижняя огибающая парабол пройденных центров в алгоритме Форчуна.

Что унести

ЛОКАЛИЗАЦИЯ
полосы (Добкин, Липтон, 1976): запрос - два двоичных поиска, O(log n)
    память до O(n²): лестница из 60 отрезков - 1860 записей
    сравнение в полосе - в середине полосы, в целых
трапецоидная карта (Сейдел 1991, Малмулей 1990), случайный порядок:
    ожидаемо O(n) памяти (трапеций <= 3n + 1), O(log n) на запрос,
    O(n log n) на построение
граница полос - договор: полуоткрытые полосы, иначе споры на вертикали
kd-ДЕРЕВО
узел: медиана по оси, ось по кругу; глубина log n
поиск: ближнее поддерево, потом дальнее, если
       (q[ось] − p[ось])² < лучшее   (для ничьих - <=)
600 точек на плоскости: 14 узлов на запрос, все 40 верны
300 точек: d = 2 - 4% узлов, d = 4 - 12%, d = 8 - 67%
большая размерность: LSH, графы близости (HNSW)
scipy.spatial.KDTree / cKDTree; в PostGIS - оператор <->
ДИАГРАММА ВОРОНОГО
ячейка = пересечение полуплоскостей серединных перпендикуляров
вершина = центр пустой окружности через 3 центра
ребро = равноудалено от 2 центров при пустой окружности
бесконечна ячейка центра на границе выпуклой оболочки
V <= 2n − 5, E <= 3n − 6; в общем положении V = 2n − 2 − h
    12 центров, h = 5: 17 вершин
пустота окружности - определитель 3 × 3 в целых
    (тот же предикат - в следующей главе)
«кто ближе» = локализация точки в диаграмме, O(log n)
АЛГОРИТМ ФОРЧУНА (1987)                       O(n · log n)
прямая сверху вниз, статус - береговая линия
парабола центра p при прямой y = l:
    y = ((x − px)² + py² − l²) / (2 (py − l))
над береговой линией всё окончательно; изломы чертят рёбра
событие «центр»: дуга X → X Y X, дуг <= 2n − 1
событие «окружность»: нижняя точка пустой окружности через три
    соседние дуги, средняя исчезает, рождается вершина
    A, D, C из урока: центр (11,444; 7,111), событие на высоте 0,289
ложные тревоги удалять из очереди

Ловушки джокера

Запрос на вертикали полосы. Отрезок, начавшийся ровно в x запроса, то входит в полосу, то нет.

Фиксированный порядок вставки в трапецоидную карту. Найдётся вход, где граф поиска - цепочка.

Отсечение kd-дерева по точке узла, а не по прямой. Ближайший прячется у границы.

Строгое неравенство в отсечении при правиле ничьих. Отделение с меньшим номером на границе теряется.

kd-дерево для векторов из сотен признаков. Это перебор с накладными расходами.

Зоны по растру вместо диаграммы. Грубо или огромно.

События-окружности для несоседних дуг и без отмены. Ложные вершины внутри чужих ячеек.

Проверь себя

Почему для локализации хватает отрезка под точкой? Откуда квадратичная память у полос и как её чинит трапецоидная карта? Почему отсечение в kd-дереве верно и почему в восьмимерии оно почти не работает? Почему ячейка Вороного выпукла, что такое её вершина и почему вершин не больше 2n − 5? Что окончательно над береговой линией и когда наступает событие-окружность?

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

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.