【发布时间】:2014-06-25 07:08:54
【问题描述】:
情况:
给定一些坐标为 (x, y) 的点 范围 0
我必须找到在其边缘和内部至少包含 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 个点。
这在时间上效率很低。
第一季度。在不改变我使用的算法的情况下,我应该使用什么数据结构来提高时间效率?
Q2。这个问题的高效算法?
【问题讨论】:
-
有趣的问题。我想知道这个问题是否是 NP 难的。
-
您可能会在“n(或k)最近邻居”问题中找到一些有用的想法,其中unifrom norm 用于表示距离。
-
@NPE:一点也不。输入域可以排序,事实证明这是最难的部分。从那里开始计数。
-
NPE:当然不是,显然有一个多项式时间算法:给定一个解平方,我们可以缩小它,同时仍然包含相同的点,直到它的三个边包含集合中的一个点。因此,通过考虑所有 3 个点的子集,我们可以找到正方形。
-
This paper 为该问题提出了一个 O(n log n + kn log^2 k) 算法,其中 n 是点数,k 是必须在正方形