Если вы просто хотите найти ближайшие k
баллы, что вы думаете об этом?
Начните с помещения первых k
точек в некоторый отсортированный массив (в зависимости от расстояния до исходной точки), и рассчитайте максимальное расстояние, назовите это d_max
.
Для каждой новой точки p
выполните следующую проверку:
if (x_p - x_start > d_max) or (y_p - y_start > d_max)
then disregard(x)
else:
d = distance (x, start);
if d < d_max
then:
insert_into_array(x) // obviously the array must stay sorted
d_max = distance(array[k],start)
Идея заключается в следующем: если разница между X-координатами или Y-координатами больше, чем максимальное расстояние, то расстояние также будет больше.
1012 * Е.Г. *
Представьте, что ваша начальная точка (2,2), и вы уже добавили (2,6), (2,3) и (3,2), тогда d_max будет равно 4.
Другие ваши очки: (10,0), (0,20) и (5,6), тогда произойдет следующее:
Add (10,0)? No, because 10 - 2 > 4 (x_p - x_start > d_max)
Add (0,20)? No, because 20 - 2 > 4 (y_p - y_start > d_max)
Add (5,6) ? Maybe: 5 - 2 <= d_max (X-coordinates) => ok
6 - 2 <= d_max (Y-coordinates) => ok
distance((5,6),(2,2)) = 5, which is larger than 4 => don't add (5,6)
Очевидно, вам нужно создать какой-то «массив»:
- , где вы можете добавить точку где-то посередине, чтобы другие сместились соответственно (связанный список).
- Если вы добавили точку и у вас уже есть записи
k
, последняя запись должна быть удалена.
Поскольку вам нужно только сравнить расстояния, нет необходимости вычислять квадратный корень.