Algorithm 在O(n^2)中找到任何与毕达哥拉斯方程匹配的三元组

Algorithm 在O(n^2)中找到任何与毕达哥拉斯方程匹配的三元组,algorithm,Algorithm,我认为在假日解决这个问题很有趣: 给定n整数,所有整数都在1..n^3中,找出是否有一个三元组与O(n^2)中的毕达哥拉斯方程相匹配 正如你们所知,毕达哥拉斯方程是a^2+b^2=c^2。例如3^2+4^2=5^2 正如您所知,O(n^2 logn)很简单(只需稍加思考),但有助于解决O(n^2)。(空间并不重要) 编辑:正如yi_H提供的,有一个查找表可以很容易地解决这个问题,但为了使它更难,空间限制是O(n^2)。我猜O(n^2 log n)应该是对数字进行排序,取任意两对(O(n^2))并

我认为在假日解决这个问题很有趣:

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

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

正如您所知,O(n^2 logn)很简单(只需稍加思考),但有助于解决O(n^2)。(空间并不重要)

编辑:正如yi_H提供的,有一个查找表可以很容易地解决这个问题,但为了使它更难,空间限制是O(n^2)。

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

现在,如果空间不是问题,您可以为O(n)中的所有值创建一个散列,然后您可以使用O(1)在该散列中查找
c
,因此它将是O(n^2)。您甚至可以为它创建一个查找表,因为数字介于1..n^2之间,所以它将保证为O(1)查找;)您还可以使用一个特殊的查找表,它可以在O(1)中进行初始化、添加和查找。

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


现在,如果空间不是问题,您可以为O(n)中的所有值创建一个散列,然后您可以使用O(1)在该散列中查找
c
,因此它将是O(n^2)。您甚至可以为它创建一个查找表,因为数字介于1..n^2之间,所以它将保证为O(1)查找;)您还可以使用一个特殊的查找表,它可以在O(1)中进行初始化、添加和查找。

所有毕达哥拉斯三元组
(a、b、c)
都具有以下关系:

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

(意思是:
m
n
没有共同因素


我想人们可以找到一种算法,利用这一信息来产生
n^3
以下的所有三元组。

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

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

(意思是:
m
n
没有共同因素



我想人们可以找到一种算法,利用这一信息来产生低于
n^3
的所有三元组。

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

O(n2)时间,O(n)空格:对所有数组元素进行平方运算,排序,对于数组中的每个z,使用经典的线性时间算法确定数组中是否存在x,y,以便x+y=z。

哈希是一个好主意,但哈希中的搜索是按O(1)摊销的,并非所有时间都适用于任何输入。此外,散列可能会导致冲突,这取决于输入大小和应采用的散列大小,而且创建大散列(防止冲突)可能会导致大于O(n^2)时间,我不知道应该以数学方式显示它。如果您选择哈希函数作为标识函数,您将得到一个查找表。有一些带有O(1)的查找表初始化、插入、搜索和删除。麻省理工学院算法简介,练习11.1-4就是一个例子。其实并不难,现在轮到你思考了;)书中的提示:“使用一个额外的堆栈,其大小是实际存储在字典中的键的数量,以帮助确定庞大数组中的给定条目是否有效。”哈希是一个好主意,但在哈希中搜索是按O(1)摊销的,并非所有时间都适用于任何输入。此外,散列可能会导致冲突,这取决于输入大小和应采用的散列大小,而且创建大散列(防止冲突)可能会导致大于O(n^2)时间,我不知道应该以数学方式显示它。如果您选择哈希函数作为标识函数,您将得到一个查找表。有一些带有O(1)的查找表初始化、插入、搜索和删除。麻省理工学院算法简介,练习11.1-4就是一个例子。其实并不难,现在轮到你考虑了;)书中的提示:“使用一个额外的堆栈,其大小是字典中实际存储的键数,来帮助确定巨大数组中的给定项是否有效。“+1很好的等式,但仍然有3个不同的变量,(m,n,d)@Saeed:我正在重新阅读你的描述。你有
n
整数,它们在
1..n^3
范围内。如果你有
1..n^3
范围内的所有数字,方程会更有用。@ypercube,我想你应该更详细地阐述你的想法,我有一个稍微复杂的算法来解决这个问题,但是如果你能找到一个简单的数学公式就好了。不,我认为以前被称为d的@the guy有最好的方法。如果你在检查表中有更多的数字,按照
O(n^3)
+1个很好的方程的顺序,我的方法会更好,但你仍然有3个不同的变量,(m,n,d)@Saeed:我正在重新阅读你的描述。你有
n
整数,它们在
1..n^3
范围内。如果你有
1..n^3
范围内的所有数字,方程会更有用。@ypercube,我想你应该更详细地阐述你的想法,我有一个稍微复杂的算法来解决这个问题,但是如果你能找到一个简单的数学题就好了。不,我认为以前被称为d的@the guy有最好的方法。如果你在检查表中有更多的数字,我的方法会更好,顺序是
O(n^3)
。我喜欢这个想法。根本不需要哈希或任何内存分配-您可以在输入数组中就地运行它。您可能想解释一下“经典”