Ситуация:
Учитывая некоторые точки с координатой (x, y) Диапазон 0 < x < 100 000 000 и 0 < y < 100 000 000
Мне нужно найти наименьший квадрат, который содержит по крайней мере N точек точек на его краю и внутри него.
-
Я использовал вектор для хранения координат и поиска всех квадратов с длиной стороны minLength до длины стороны maxLength (применяя грубую силу в соответствующем пространстве)
struct Point { int x; int y; }; vector<Point> P; int minLength = sqrt(N) - 1; int maxLength = 0; // bigx= largest x coordinate of any point // bigy= largest y coordinate of any point // smallx= smallest x coordinate of any point // smally= smallest y coordinate of any point (bigx - smallx) < (bigy - smally) ? maxLength = (bigx - smallx) : maxLength = (bigy - smally);
-
Для каждого квадрата я поднял глаза, пройдя через полный вектор, чтобы увидеть, находится ли по крайней мере N точек на его краю и внутри него.
Это было довольно неэффективно.
Q1. Какую структуру данных следует использовать для повышения эффективности работы без изменения алгоритма, который я использовал?
Q2. Эффективный алгоритм для этой проблемы?