休息时间,找到与O(n ^ 2)中的毕达哥拉斯方程匹配的任何三元组

时间:2011-09-17 12:42:00

标签: algorithm

我认为在假期解决这个问题很有意思:

给定n个整数,所有这些整数都在1..n^3内,找出是否存在与O(n ^ 2)中的毕达哥拉斯方程匹配的三元组。

如你所知,毕达哥拉斯方程为a^2 + b^2 = c^2。例如3^2 + 4^2 = 5^2

如你所知,O(n ^ 2 log n)很容易(稍加思考),但有助于解决O(n ^ 2)。 (空间并不重要)。

编辑:由于yi_H提供了查找表,可以轻松解决此问题,但为了使其更难,空间限制为O(n ^ 2)。

3 个答案:

答案 0 :(得分:4)

所有毕达哥拉斯三胞胎(a,b,c)都有以下关系:

a = d * (2 * m * n)
b = d * (m^2 - n^2) 
c = d * (m^2 + n^2)

,其中

d >= 1  and  (m,n) = 1

(意思是:mn没有共同因素。

我想可以找到一种算法,使用此信息生成低于n^3的所有三元组。

答案 1 :(得分:4)

O(n 2 )时间,O(n)空间:方形所有数组元素,排序,对于数组中的每个z使用经典线性时间算法来确定是否存在x,数组中的y使得x + y = z。

答案 2 :(得分:3)

我猜O(n ^ 2 log n)将对数字进行排序,取任意两对(O(n ^ 2))并查看{{1}中的数字是否c }}。您可以使用二进制搜索查找c^2 = a^2 + b^2,即O(log(n))。

现在,如果空间不是问题,你可以为O(n)中的所有值创建一个哈希,那么你可以用O(1)在这个哈希中查找c,所以它会是为O(n ^ 2)。您甚至可以为它创建一个查找表,因为数字在1..n ^ 2之间,所以它将是一个保证的O(1)查找;)您还可以使用一个特殊的查找表,它可以进行初始化,添加和在O(1)中查找。