Поиск наименьшего расстояния между точками.

Тема в разделе "WASM.A&O", создана пользователем Medstrax, 3 мар 2010.

  1. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Пусть дан массив точек на плоскости. На плоскости задается произвольная точка, надо найти точку(точки) в массиве, расстояние от которых до заданной точки наименьшее. Как это сделать оптимально, без полного перебора массива?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Без полного перебора массива останутся непроверенные точки.
     
  3. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Дико извиняюсь, но ИМХО бредъ.
    Задача решается за один просмотр массива, на неквантовом компе быстрее некуда.
     
  4. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Добавлю. С исходными данными (т.е. с массивом точек) предварительно можно делать все что угодно. Как угодно сортировать, преобразовывать в массивы большей размерности, вычислять какие то промежуточные значения, вводить дополнительные структуры данных и пр.
     
  5. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Зато радиус-векторы каждый раз совершенно новые, тебе ведь именно они нужны...
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    medstrax1
    Разбиваешь плоскость на квадраты или прамоугольники(если точки сильно неравномерно разбросаны) чтобы в каждый из них попадало небольшое число точек. Ну а дальше определаешь в какой квадрат попадает точка и сравниваешь со всеми точками из него. Потом сравниваешь со всеми соседними квадратами растояние до ближайшего угла или стороны которых меньше чем найденный минимум. Когда таких квадратов не останется, это будет означать что растояние найдено.
     
  7. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Мда... Проще но дольше перебрать данный квадрат и восемь ближайших.
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    первое, что пришло в голову. решение в лоб. при ограниченой и небольшой площади всего этого безобразия - двумерный массив с достаточным разрешением, где каждой координате-ячейке заранее присвоена ссылка на ближайшую точку из вашего массива. в таком случае поиск делается за один ход.

    Point *pt = map[x][y];

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

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    persicum
    Для этого нужно делить плоскость так, чтобы в каждом квадрате была хоть одна точка. Есть у меня подозрение что здесь уже будут не квадраты.
     
  10. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Есть мысль разбить всю область, содержащую точки, на равные квадраты таким образом, чтобы каждый квадрат содержал не более одной точки. Потом для каждого квадрата составить список ближайших квадратов, содержащих точки.
    Тогда на первый взгляд все становится тривиально.
    Однако.
    1) Наталкиваемся на чисто технические трудности, при большом количестве точек элементарно не хватит оперативы для запоминания всех квадратов. В исходной задаче предполагается около 10^6 точек.
    2) Непонятно как определять понятие "квадрат, ближайший к заданному". Т.е. с близостью квадратов все ясно, а вот с близостью точек в этих квадратах - не совсем. Если заданная точка и точка в "ближайшем квадрате" расположены по противоположным углам, а сами квадраты расположены про диагонали относительно друг друга, то далеко не факт, что расстояние между этими точками будет наименьшим из всех возможных. Возможно будет существовать точка в квадрате, который "дальше", но она расположена рядом с "ближней" стороной(углом)
     
  11. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Так же непонятно как быть, когда заданная точка попадает в область, далекую от области, содержащей исходные точки. К примеру весь массив точек попадает в квадрат (0,0) (100, 100). А если заданная точка будет (1000, 1000) ?
     
  12. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    В упрощенном мною =))) варианте, который требует просмотра 9-ти смежных квадратов, достаточно разбить плоскость на равные квадраты так, чтобы как минимум одна точка приходилась не на один, а на девять квадратов. Некоторые пустые квадраты допускаются, а фигли? Это проще тем тянуться к ним прямоугольниками, пусть некоторые квадраты будут пустыми, если точки не слишком равномерны
     
  13. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    medstrax1
    Можно построить двоичное или четверичное дерево. Если строим двоичное то на нечётных уровнях делим плоскость по горизонтали, а на чётных по вертикали. Для поиска огранизовываем пирамиду еще непросмотренных поддеревьев упорядоченную по минимальному растоянию до ближайшего угла. Изначально туда помещаем указатель на корень дерева. Далее вытаскиваем поддерево с вершины очереди, смотрим как наша точка расположена относительно разделительной линии, и кладём найдённые поддеревья в очередь. Если дошли до листа, содержащего какую-то точку, то сравниваем растояние до неё с минимальным. Ну а прекращаем поиск когда минимальное растояние станет меньше растояния до ближайшей точки поддерева с вершины очереди.
     
  14. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    У деревьев вычислительная сложность будет O(log n) , типа бинарного поска...
    А у квадратов будет сложность O(1), что ближе к хешам...
     
  15. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Определяем для массива точек максимальное расстояние Dmax между ними (условно поперечник облака точек), и определяем центр масс M(xm,ym). Для новой точки T(x,y) определяем расстояние MT и сравниваем с Dmax/2. Если меньше - мы внутри облака точек, иначе - вне его. Строим окружность с центром в новой точке, радиуса R=min(Dmax/2;MT)/2. Для избежания вычислений с квадратами, синусами и косинусами, вместо окружности будем исследовать квадрат, между (x-R,y-R)-(x+R,y+R). Если внутри квадрата не обнаружено ни одной точки, увеличиваем радиус на некоторую величину (можно продумать оптимальный шаг, или даже сделать его переменным). Для всех точек P, попавших внутрь квадрата, ищем расстояние TP(i), отбираем минимальное. Если расстояние получается больше R, значит, точка из угла квадрата, берем это расстояние за новое R и повторяем операцию. Вычисление расстояния - длительная операция, сравнительно. Квадраты, корень квадратный - или тригонометрия. А вот проверка, попадает ли точка в окрестности, с заданным радиусом - более быстрая, сравнение координаты на больше-меньше. Если массив точек изначально сортирован по Х, то даже сравнение не будет происходить со всем массивом. Чего-то такое видится.
     
  16. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Правда, будет особый случай, когда центр масс пустой (а это вполне вероятно), а новая точка попала тютелька в него, расстояние =0.
     
  17. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    FatMoon

    Не-не, продолжай - мне твоя идея нравиццо. Может как-то отсортировать кругами вокруг центра масс (или не центра масс но точки где Sum(Ri)=min (минимальная сумма модулей векторов до всех точек).
     
  18. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    проход всего массива и поиск минимума r=sqtr((xi-x)^2+(yi-y)^2)
    элементарная геометрия чего мудрите то ???
     
  19. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    medstrax1
    а как не исследовав точку что то узнать о ней ???
    по любому нужно один раз пройти весь массив -иначе никак
     
  20. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Rockphorr
    Ты уже третий кто высказывает такое неправильное мнение :)