Я пытаюсь найти лучший способ решения проблемы ниже:
Проблема
У меня есть (до) 100 000 точек широты / долготы в наборе А
У меня есть (до) 2000 лат / лн очков в наборе B
Мне нужно найти ближайшего соседа точек в наборе B к точкам в наборе A.
Как только они были соединены - мне нужно вычислить их расстояние, которое будет:
2000 Set A points to 2000 Set B Points.
Эти точки находятся «в памяти», они не берутся из базы данных - они являются результатом других вычислений, выполненных в системе.
Текущее решение
Используя реализацию KDTree в Ruby, я могу создать поиск KDTree, который будет соответствовать моим точкам. Затем я использую метод haversine в Ruby, чтобы вычислить расстояние между точками, когда они связаны.
Код KDTree: Код KDTree Ruby
Код Хаверсин Код Хаверсайн
Платформа
У меня работает jruby - с рельсами в качестве веб-фреймворка.
Выпуск
Это медленно! От 30 до 40 секунд медленно ... Я думаю, что основная горловина бутылки находится в KDtree, но поиск точки тоже занимает много времени (я думаю). При меньших числах в наборе B он быстрее, но при большем количестве очков в наборе B он становится намного быстрее.
Вопрос
Кто-нибудь подумает сделать это по-другому? Есть что-то, чего мне не хватает. Я думаю, что библиотека Java могла бы быть намного быстрее, но как бы я это реализовал, и какую бы я использовал (не сильно в Java - я использую Jruby для многопоточности кода ruby в JVM)