Вот хороший обзор часто используемых методов: https://en.wikipedia.org/wiki/Nearest_neighbor_search
То, что вы описываете, - это линейный поиск (так как вам нужно вычислить расстояние до каждой точки в наборе данных).Хорошо, что это всегда работает.Плохая вещь в том, что он медленный, особенно если вы часто его запрашиваете.
Если вы немного больше знаете о своих данных, вы можете получить более высокую производительность.Если данные имеют низкую размерность (2D, 3D) и равномерно распределены (это не означает идеально, просто не в очень плотных и очень плотных кластерах), тогда разделение пространства работает отлично, потому что оно быстро сокращает точки, которые находятся слишком далеков любом случае (сложность O (logN)).Они также работают для большей размерности или, если есть некоторые кластеры, но производительность немного снижается (все же лучше в целом, чем линейный поиск).
Обычно для общих наборов данных достаточно разделения пространства или хеширования с учетом локальности.
Компромисс состоит в том, что вы используете больше памяти и некоторое время на настройку для ускорения будущих запросов.Если у вас много запросов, то оно того стоит.Если у вас всего несколько, не так много.