二维空间中有n个点。你能建议有效的算法输出所有形成正方形的四元组。
答案 0 :(得分:2)
有简单的O(n ^ 3)算法。 拿一对点(黑色)。对于这一对,我们可以检查其他点作为可能的候选人形成一个方形 - 绿色和红色的地方。如果我们找到了两个绿点或两个红点,则输出由初始对和这些点形成的平方。伪代码:
for i = 0 to n-4 do
for j = i+1 to n-3 do
Calc Green1Coordinates
Green1 = 0
... the same for Green2 and Reds
for k = j+1 to n-1 do
if P[k] = Green1Coordinates then
Green1 = k
else
the same for Green2 and Reds
if Green1 and Green2 then
outputSquare(i,j,Green1,Green2)
if Red1 and Red2 then
outputSquare(i,j,Red1,Red2)
答案 1 :(得分:1)
您应该能够在O(n ^ 2 logn)中执行此操作。
对于每个点,按距离对所有其他点进行排序。由于一个正方形需要两个等距点和一个距离乘以sqrt(2)
的点,因此您可以轻松找到候选组。完成后,可以several methods检查组的方形度。
for each point a
sort other points by distance to a
find duplicate pair b, c
for each duplicate pair
find point d with distance *= sqrt(2)
if d exists, check for square a, b, c, d
如果您关注距离测量,可以使用平方距离省略sqrt()
功能。如果您这样做,只需检查斜边距离是2
而不是sqrt(2)
答案 2 :(得分:0)
这是一个检查四元组的简单算法: -
根据斜坡打破所有点对,首先是较小的长度。
扫描已排序的列表并检查相邻对与当前对的长度相同&斜率。
如果发现这样的对找到它的平行距离并检查它是否与长度相同。如果是这样,则四元组成一个正方形。
如果没有找到继续列表中的下一对
对排序列表中的所有对执行此操作。
时间复杂度:平均情况O(N^2*logN)
空间复杂度:O(N^2)