给定一个平面上的n个点,可以形成多少个正方形…?
我通过计算每个2个点之间的距离进行尝试,然后对其进行排序,然后在验证了点和坡度后查找具有四个或更多个相等距离的点中的正方形。
但这似乎是一种非常复杂的方法。还有其他想法吗?
我认为用于检查等距离线段的动态编程可能有用…但是无法完全理解这个想法....
还有更好的主意吗???
PS:平方可以是任何形式。它们可以重叠,有一个共同的一面,一个正方形内另一个…
如果可能,请提供示例代码以执行上述操作…
让d[i][j] = distances between points i and j。我们对一个count(i, j)可以尽快返回通过使用point i和绘制的平方数的函数感兴趣j。
d[i][j] = distances between points i and j
count(i, j)
i
j
基本上,count(i, j)必须找到两个点x,并y使得d[i][j] = d[x][y]和检查,如果这4个点真正定义一个正方形。
x
y
d[i][j] = d[x][y]
您可以使用哈希表O(n^2)平均解决该问题。让H[x] = list of all points (p, q) that have d[p][q] = x。
O(n^2)
H[x] = list of all points (p, q) that have d[p][q] = x
现在,对于每对点(i, j),count(i, j)将必须迭代H[ d[i][j] ]并计算该列表中的点,这些点i与和组成一个正方形j。
(i, j)
H[ d[i][j] ]
在实践中,这应该运行得非常快,而且我认为它不会变得更糟O(n^3)(我什至不确定它是否会变得如此糟糕)。
O(n^3)