У меня есть популяция так называемых «Точек», которые ищут еду. Каждая точка имеет значение «sight_», которое указывает диапазон, в котором она может видеть еду. Положение каждой точки сохраняется как pair<uint16_t,uint16_t>
. Позиции всех источников пищи указаны в виде vector<pair<uint16_t,uint16_t>>
.
Теперь я хочу рассчитать ближайший источник пищи для каждой точки, которую эта точка может видеть. И я не хочу рассчитывать расстояние каждой комбинации.
Моя идея состояла в том, чтобы создать копию вектора еды, отсортировав одну копию по x, а другую по y. Затем найдите интервал [x-sight, x+sight] соответственно [y-sight, y+sight] в векторах, а затем создайте пересечение обоих. Я прочитал set_intersection, но он требует, чтобы оба диапазона были отсортированы по одному и тому же правилу.
Любые идеи, как я мог это сделать? Также может быть, что моя идея - это просто неправильный подход.
Спасибо, IceFreez3r.
Редактировать: я сделал некоторые приближения во время выполнения:
Сортировка еды: n log n
Интервал поиска для одной координаты и одной точки: 2 log n (нижняя и верхняя граница)
Если мы предполагаем равное распределение источников пищи, мы можем сначала вычислить границу, которая оценивается ближе к середине, а затем вычислить вторую границу в оставшемся интервале. Это сократит время выполнения до: log n + log(n/2) (Только что понял, что это, вероятно, не *эта* мощная:log(n/2) =~ log(n) - 1)
Построить пересечение: #x * #y =~ (n * view/testgroundsize)^2
Вычислить точное расстояние для каждой еды на пересечении: n * (sight/testgroundsize)^2
Сумма: 2 n log n + 2 * #Dots * (log n + log(n/2) + (n * прицел/размер тестовой площадки)^2 + n * (прицел/размер тестовой площадки)^2)
Сумма с ограничением одна координата: n log n + #Dots * (log n + log(n/2) + n * прицел/размер тестовой площадки)
Я сделал несколько тестов и просто рассчитал приведенные выше формулы на ходу:
int dots = dots_.size();
int sum = 2 * n * log(n) + 2 * dots * (log(n) + log(n/2) + pow(n * (sum_sight / dots) / testground_size_,2) + n * pow((sum_sight / dots) / testground_size_, 2));
int sum2 = n * log(n) + dots * (log(n) + log(n/2) + n * (sum_sight / dots) / testground_size_);
cout << n*dots << endl << sum << endl << sum2 << endl;
Оказалось, что идея Intersection просто плоха. Хотя идея ограничиться одной координатой, по крайней мере, лучше, чем грубая сила.
Я еще не думал об идее сетки @Daniel Jour