Кратчайшее расстояние между точкой в ​​A и точкой в ​​B

9

Для двух наборов и каждый из которых содержит непересекающихся точек на плоскости, вычисляется кратчайшее расстояние между точкой в и точкой в , т. Е. .ABnABmin { dist(p,q) | pAqB }

Я не уверен, прав ли я, но эта проблема очень похожа на проблемы, которые можно решить с помощью линейного программирования в вычислительной геометрии. Однако сокращение до LP не является простым. Также моя проблема выглядит связанной с нахождением тончайшего условия между двумя наборами точек, которое, очевидно, может быть решено с помощью LP в O(n) в 2-мерном пространстве.

ком
источник
4
Какой вопрос здесь?
Рафаэль
Я не эксперт, но обычно в машинном обучении, где эти точки являются данными, наборы ведут себя хорошо большую часть времени и сгруппированы вместе, поэтому алгоритмы, подобные предложенному @Pedro, работают хорошо.
chazisop
3
«которая, очевидно, может быть решена с помощью LP в O (n) в 2-мерном пространстве» - интересно, что побудило это утверждение. «Линейное программирование» в общем случае неразрешимо в линейном времени; «линейный» относится к чему-то еще. Так есть ли у LP особая форма?
Рафаэль

Ответы:

5

У меня есть решение, которое может показаться немного запутанным, но должно быть более эффективным, чем наивный перебор:O(n2)

  1. пусть будет ось между центрами масс и .A BvAB
  2. Сортируйте точки в и вдоль этой оси в порядке убывания и возрастания соответственно, получая последовательности , , ..., и , , ..., .B a 0 a 1 a n b 0 b 1 b nABa0a1anb0b1bn

Остальное в псевдокоде, чтобы было понятнее:

d = infinity.
for j from 1 to n
    if (b_1 - a_j) along v > d then break endif
    for k from 1 to n
        if (b_k - a_j) along v > d then
            break
        else
            d = min( d , ||b_k - a_j|| )
        endif
    enddo
enddo

То есть, предварительно отсортировав точки вдоль , вы можете отфильтровать пары, которые никогда не будут находиться в пределах друг от друга, поскольку вдоль всегда будет,vdbkajvbkaj

В худшем случае это все еще , но если и хорошо разделены, это должно быть намного быстрее, чем это, но не лучше, чем , что требуется для сортировки.O(n2)ABO(nlogn)

Обновить

Это решение ни в коем случае не вытащено из шляпы. Это особый случай того, что я использую при моделировании частиц, чтобы найти все взаимодействующие пары частиц с пространственным биннингом. Моя собственная работа, объясняющая более общую проблему, здесь .

Что касается предложения использовать модифицированный алгоритм строчной развертки, хотя и интуитивно простое, я не уверен, что это в когда рассматриваются непересекающиеся множества. То же самое касается рандомизированного алгоритма Рабина.O(nlogn)

Похоже, не так много литературы, посвященной проблеме ближайших пар в непересекающихся множествах, но я нашел это , которое не претендует на то, что находится под , и это , что не кажется делать какие-либо претензии о чем-либо.O(n2)

Вышеприведенный алгоритм можно рассматривать как вариант развертки плоскости, предложенный в первой статье (Шань, Чжан и Зальцберг), однако вместо использования оси и отсутствия сортировки используется ось между наборами и обходы множеств в порядке убывания / возрастания.x

Pedro
источник
2
@Pedro: Извините, я не комментировал ранее (нет времени в то время). Причина, по которой я отклонил ваш ответ, была в том, что он был плохим и не должен был быть на высоте. На самом деле это хорошо известная проблема в вычислительной геометрии с наихудшим случаем O (n log n). Хороший ответ указал бы на известную проблему (возможно, со ссылкой) и общие решения, которые включают в себя: использование деревьев kd и тестирование по элементам, алгоритмы развертки и т. Д. Общая идея должна заключаться в предварительной обработке в упорядоченной структуре и использовании этого , Посмотрите на 1D случай - более очевидный O (n log n) там.
ex0du5
2
@ ex0du5: Звучит так, как будто вы должны опубликовать свой ответ! Обратите внимание, что «есть лучший ответ», как правило, не является хорошей причиной для понижения рейтинга; эта мера должна быть зарезервирована для неправильных, спамовых и очень плохо отформатированных ответов. Педро не является ни тем, ни другим. Смотрите также здесь, чтобы узнать, сколько мыслей должны думать некоторые люди, прежде чем понизить голос.
Рафаэль
1
@ Рафаэль: Я не отвечал, потому что был один честный ответ, и у меня не было времени, чтобы найти ссылки. Что касается вашей ссылки о том, как понизить голос, это ужасный алгоритм для этих сайтов! Студенты CS особенно должны понимать важность не потерять цель для формализма. Цель голосования - переместить ответы в рейтинг, который поможет последующим учащимся с той же проблемой найти наиболее полезные ответы. Мой алгоритм голосования делает это. Этот алгоритм: очевидно, нет. Это можно обсудить на мета, если хотите, но, как взрослые, я думаю, что мы должны использовать наши силы навсегда, я думаю.
ex0du5
1
@ ex0du5: Кажется, у тебя сейчас немного времени. Можете ли вы показать, что этот экземпляр на самом деле является «хорошо известной проблемой с наихудшим »? O(nlogn)
Педро
1
@ ex0du5: На самом деле, поиск ближайшего соседа, например, с использованием деревьев kd , имеет только среднюю сложность O (logn) . Итак, мы вернулись к исходной точке.
Педро
4

Вы можете адаптировать алгоритм перестановки строк "ближайшая пара" , который является .O(nlogn)

Единственное изменение, которое вам нужно будет сделать, это игнорировать пары, которые принадлежат одному и тому же набору.

Изменить: это на самом деле не просто (или даже возможно), как я описал. Смотрите комментарии для обсуждения.

Artium
источник
2
Просто замечание: можно также адаптировать классический алгоритм «разделяй и властвуй» для ближайших пар, который также работает в ; см. также Википедию . O(nlogn)
rizwanhudda
1
Для рандомизированного алгоритма линейного времени, см., Например, Рабин Бросает монету в блоге Липтона.
Юхо
3
Не могли бы вы рассказать немного о том, как бы вы реализовали это для непересекающихся множеств, особенно в том, что касается поддержания границы ? O(nlogn)
Педро
-1 за некорректность. Алгоритм связывания линий ближайших пар, который вы связываете, опирается на отсортированный набор, содержащий элементов, но в случае непересекающихся наборов этот набор начинается с элементов, поэтому он больше не находится в , в хотя бы не в худшем случае. O(1)nO(nlogn)
Педро
1
@Pedro: с чего бы это было больше? Во всяком случае, набор текущих точек-кандидатов должен сократиться.
Рафаэль
4

Идея в таких задачах состоит в том, чтобы создать упорядоченную структуру из одного из наборов, которая позволяет эффективные запросы ближайшего соседа. Классическая статья, в которой была представлена ​​структура запроса O (log n) для произвольного измерения:

Шамос и Хой о решениях Вороного

С тех пор был создан ряд других космических перегородок, основанных на идеях тесселяций Делоне, и они также приводят к различным описаниям подпространственной развертки. Обратите внимание, что метод Вороного также подпадает под общее описание «разделяй и властвуй» из-за его плоского разбиения, которое делает этап построения O (n log n).

Итак, основное решение этой проблемы:

  1. Возьмите набор A и постройте эффективную структуру запроса ближайшего соседа по вашему выбору. Этот шаг построения равен O (n log n) [см. Теорему 4].
  2. Для каждого элемента в B, структура запроса A для ближайшего соседа. Каждый запрос O (log n) [см. Теорему 15, фиксированное измерение], поэтому общее время запроса для всех точек в B равно O (n log n).
  3. Когда будет получен результат для ближайшей точки A к каждому B, поместите его в структуру, упорядоченную на расстоянии. Это O (log n) вставить каждый результат или O (n log n) для всех.
  4. Когда все B были рассмотрены, вы можете быстро (O (1)) получить точку B в упорядоченной структуре с наименьшим соседним расстоянием до точки в A.

Как видно из сложности каждого шага, общая сложность составляет O (n log n). Для современного читателя, не смотрящего на классические статьи, это описано во многих книгах по алгоритмам, например, "Руководство по разработке алгоритмов" Скиены.

ex0du5
источник
1
«Решение Artium, например, может быть написано в этой форме и является полностью действительным». - хорошо, что вы предлагаете здесь, больше не является (чистым) алгоритмом строчной развертки, поэтому я не знаю об этом.
Рафаэль
@ Рафаэль: Конечно, это так. Алгоритмы развертки предварительно обрабатывают точки в упорядоченную структуру, как описано здесь. Я даже связался с алгоритмом Фортуны под его ответом, который показывает, что алгоритм стреловидности является лишь примером алгоритма Вороного. Причина, по которой я оставил решение универсальным для структуры запроса, заключается в том, что для этого было разработано большое количество геометрических механизмов.
ex0du5
Вам не нужен конкретный порядок при итерации по , тогда как порядок важен для (много / все?) Алгоритмов строчной линии (отсюда и название, я думаю). B
Рафаэль
1

Я не уверен, прав ли я, но эта проблема очень похожа на проблемы, которые можно решить с помощью линейного программирования в вычислительной геометрии. Однако сокращение до LP не является простым. Также моя проблема выглядит связанной с нахождением самого тонкого условия между двумя наборами точек, которое, очевидно, может быть решено с помощью LP в 2-мерном пространстве.

Нижняя граница для этой задачи - в алгебраической модели дерева решений. Я приведу примерный набросок его доказательства здесь.O(nlogn)

Мы сократим случай проблемы отличимости элементов E до C.

  • Ввод в E: S={a1,a2,a3,...,an}
  • Пусть > 0 - небольшая дробьϵ
  • A = ,{(ai,0):1in}B={(ai+ϵ):1in}
  • Теперь, если мы можем найти кратчайшее расстояние (d) между множествами A и B. Мы можем решить проблему отличимости элементов в дополнительное время следующим образом O(n)
    • Множество имеет дубликат тогда и только тогда, когда d =Sϵ

Мы знаем, что нижняя граница времени выполнения для решения проблемы отличимости элементов . Следовательно, при уменьшении нижняя граница также относится к нашей проблеме.O(nlogn)

rizwanhudda
источник