查找形成Square的Quatraples的算法?

时间:2013-11-20 16:40:31

标签: algorithm graph-algorithm

二维空间中有n个点。你能建议有效的算法输出所有形成正方形的四元组。

3 个答案:

答案 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)

enter image description here

答案 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)

这是一个检查四元组的简单算法: -

  1. 根据斜坡打破所有点对,首先是较小的长度。

  2. 扫描已排序的列表并检查相邻对与当前对的长度相同&斜率。

  3. 如果发现这样的对找到它的平行距离并检查它是否与长度相同。如果是这样,则四元组成一个正方形。

  4. 如果没有找到继续列表中的下一对

  5. 对排序列表中的所有对执行此操作。

  6. 时间复杂度:平均情况O(N^2*logN)

    空间复杂度:O(N^2)