Поскольку вы запрашиваете регулярную квадратную сетку с указанным пользователем интервалом, похоже, что достаточно простой подход должен сработать.
Начните с прохождения данных, чтобы определить минимальную и максимальную координаты в каждом измерении. Определите количество шагов указанного пользователем расстояния, необходимое для покрытия расстояния между максимумом и минимумом.
Пройдите через данные еще раз, чтобы выделить каждую точку ячейке в сетке, используя сетку с точкой минимума каждой координаты и указанным интервалом (например, X_cell = Math.floor ((x_i - x_min) / интервал)). Используйте словарь или массив для записи количества точек в каждой ячейке.
Теперь распечатайте координаты ячеек, в которых есть хотя бы одна точка.
У вас есть некоторая свобода, которую я не пытался оптимизировать: если расстояние между минимальной и максимальной координатой не является точным кратным расстояния между сетками, будет некоторый спад, который позволит вам перемещать сетку и продолжать пусть он содержит все точки: в данный момент сетка начинается в позиции самой низкой точки, но, вероятно, она заканчивается до самых высоких точек, поэтому у вас есть место, чтобы немного сдвинуть ее в каждом измерении. При этом некоторые точки будут перемещаться из ячейки в ячейку, и количество занятых ячеек будет меняться.
Если вы рассматриваете только движения в одном измерении за раз, вы можете решить, что произойдет достаточно эффективно. Определите расстояние в этом измерении между каждой точкой и максимальной координатой в этом измерении ее ячейки, а затем отсортируйте эти значения. При перемещении сетки вниз точка с наименьшим расстоянием до ее максимальной координаты сначала поменяет ячейки, и вы можете проходить по этим точкам одну за другой, перемещаясь по ним в отсортированном порядке. Если вы обновите количество точек в ячейках при этом, вы сможете определить, какой сдвиг минимизирует количество занятых ячеек.
Конечно, у вас есть три аспекта для беспокойства. Вы можете работать с ними по одному, пока не получите сокращение числа ячеек. Это локальный минимум, но не может быть глобальным минимумом. Один из способов поиска других локальных минимумов - начать заново со случайно выбранной начальной точки.