эффективный алгоритм поиска ближайшей точки на графике, не имеющем известного уравнения

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

У меня есть график реальных данных. Нет повторяющихся значений X, и значение X увеличивается с постоянной скоростью на графике, но данные Y основаны на реальных результатах. Я хочу программно найти ближайшую точку на графике из произвольной заданной точки P. Я пытаюсь найти для этого эффективный (то есть быстрый) алгоритм. Мне не нужна точная ближайшая точка, я могу выбрать точку, которая «почти» является ближайшей точкой.

Очевидное ленивое решение - увеличивать каждую точку на графике, вычислять расстояние, а затем найти минимум расстояния. Однако теоретически это может быть медленным для больших графиков; слишком медленный для того, что я хочу.

Так как мне нужна только приблизительная ближайшая точка, я полагаю, что идеальное уравнение для кратчайшего пути включало бы создание линии наилучшего соответствия и использование этой линии для вычисления того, где должна быть точка в реальном времени; но это звучит как потенциальная математическая головная боль, с которой я не собираюсь браться.

Мое решение - это хитрость, которая работает только потому, что я предполагаю, что моя точка P не произвольна, а именно, я предполагаю, что P обычно будет близка к моей линия графика, и когда это произойдет, я могу вычеркнуть отдаленные значения X из рассмотрения. Я вычисляю, насколько близко находится точка на линии, которая имеет общую координату X с P, и использую расстояние между этой точкой и P для вычисления наибольшего / наименьшего значения X, которое могло бы быть более близкими точками.

Я не могу не помочь, но чувствую, что должен быть более быстрый алгоритм, чем мое решение (которое полезно только потому, что я предполагаю, что в 99% случаев моя точка P уже будет точкой, близкой к линии). Я попробовал поискать в Google лучшие алгоритмы, но нашел так много алгоритмов, которые не совсем подходили, что было трудно найти то, что я искал, среди всего беспорядка неподходящих алгоритмов. Итак, есть ли у кого-нибудь здесь предложенный алгоритм, который был бы более эффективным? Имейте в виду, что мне не нужен полный алгоритм, так как то, что у меня есть, работает для моих нужд, мне просто любопытно, какое было бы правильное решение.

10
задан Nemo 22 July 2011 в 14:52
поделиться