Должен согласиться с jk и Ewan с составлением Voronoi Diagram. Это разделит пространство в многоугольниках. Каждая точка в K будет иметь многоугольник, описывающий все точки, которые ближе всего к нему. Теперь, когда вы получаете запрос точки, вам нужно найти, в каком полигоне она лежит. Эта проблема называется Point Location и может быть решена путем построения Trapezoidal Map.
jk уже связан с созданием Voronoi Diagram с использованием Fortune's algorithm, который принимает вычислительные шаги O (n log n) и затраты O (n) пространства. This website показывает вам, как сделать трапециевидную карту и как ее запросить. Вы также можете найти некоторые оценки там:
Ожидаемое время создания: O (N журнал N)
Ожидаемое пространство сложность: O (п)
Но самое главное, ожидаемое время запроса: O (журнал N). Это (теоретически) лучше, чем O (√ n) kD-дерева.
Мой источник (кроме ссылок выше): Computational Geometry: algorithms and applications, главы шесть и семь.
Здесь вы найдете подробную информацию о двух структурах данных (включая подробные доказательства). В книжной версии Google есть только часть того, что вам нужно, но другие ссылки должны быть достаточными для вашей цели. Просто покупайте книгу, если вас интересует такая вещь (это хорошая книга).
хорошее мнение! для больших наборов данных это значительно сократило бы время выполнения. –
Поскольку вы имеете дело с пикселями, это также означает, что вы можете перейти к целочисленным математикам, что является еще одним огромным бонусом скорости. –
@rikh. Даже если вам нужно расстояние, вы всегда можете сделать «sqrt», как только вы узнаете, какая точка ближайший. –