Вы захотите использовать геометрическую конструкцию, которая называется Диаграмма Вороного . Это делит плоскость на несколько областей, по одной на каждую точку, которые охватывают все точки, которые являются ближайшими к каждой из указанных вами точек.
Код точных алгоритмов для создания диаграммы Вороного и организации поисков структуры данных слишком велик, чтобы поместиться в этом маленьком окне редактирования. :)
@ Линор: По сути, это то, что вы будете делать после создания диаграммы Вороного. Но вместо создания прямоугольной сетки вы можете выбрать разделительные линии, которые точно соответствуют линиям диаграммы Вороного (таким образом вы получите меньше областей, которые пересекают разделительные линии). Если вы рекурсивно разделите свою диаграмму Вороного пополам вдоль наилучшей разделительной линии для каждой поддиаграммы, вы можете затем выполнить поиск по дереву для каждой точки, которую хотите найти. Это требует немного работы заранее, но экономит время позже. Каждый поиск будет порядка log N, где N - количество точек. 16 сравнений намного лучше, чем 15 000!