Ваше первое решение может быть самым быстрым для запросов (поскольку построение дерева не учитывает разбиения в направлениях, которые вас не интересуют), но оно определенно будет использовать много памяти. И если вам придется многократно восстанавливать деревья, это может замедлиться.
Второй вариант выглядит очень медленно, если у вас есть только несколько очков. И если это так, то вам, вероятно, не понадобилось kd-дерево. :)
Я думаю, что лучшее решение - это испачкать руки в коде, с которым вы работаете. Предположительно, поиск ближайшего соседа вычисляет расстояние между точкой в листе дерева и вектором запроса; Вы должны иметь возможность изменить это для обработки случая, когда точка и вектор запроса имеют разные размеры. Например. если точки в дереве заданы в 3D, но вектор вашего запроса имеет длину только 2, то «расстояние» между точкой (p0, p1, p2) и вектором запроса (x0, x1) будет равно
sqrt( (p0-x0)^2 + (p1-x1)^2 )
Я не копался в java-коде, на который вы ссылались, но я могу попытаться найти, куда именно нужно внести изменения, если вам понадобится помощь.
-Крис
PS - вам может не понадобиться sqrt в приведенном выше уравнении, поскольку квадрат расстояния обычно эквивалентен.
EDIT
Извините, не понимал, что это будет так очевидно в исходном коде. Вы должны использовать эту версию функции соседей:
nearest(double [] key, int n, Checker<T> checker)
И реализовать свой собственный класс Checker; см. их EuclideanDistance.java, чтобы увидеть евклидову версию. Вам также может понадобиться закомментировать любое KeySizeException, которое выдает код запроса, поскольку вы знаете, что можете обрабатывать ключи разного размера.