如果我想生成唯一的(忽略底片)毕达哥拉斯四重(形式为^ 2 + b ^ 2 + c ^ 2 = d ^ 2)具有固定的d(在这种情况下为2 ^ 15-1),这样做有比O(n ^ 3)更好的方法吗?
现在我非常粗暴地强迫它:
int r = (1 << 15) - 1;
for(int i = 0; i < r; i++)
for(int j = i; j < r; j++)
for(int k = j; k < r; k++)
if( i * i + j * j + k * k == r * r )
//add to list
哪个是O(n ^ 3),有更快的方法吗?我发现了一些可以产生四倍的snippits,但他们都说他们可能会错过一些。我看到了它们的方程式,我认为可能存在一些线性方程组方式?
答案 0 :(得分:1)
它仍然是O(n ^ 3),但你可以通过不搜索太大的数字来加快它的速度:
...
for(int i = 0; i < r; i++)
for(int j = i; j < sqrt(r^2 - i^2); j++)
for(int k = j; k < sqrt(r^2 - i^2 - j^2); k++)
...
答案 1 :(得分:1)
previously-mentioned Wikipedia page的第二个参数化说
所有毕达哥拉斯四重奏......都可以从两个正整数a,odd和b生成,甚至...... 令p为a ^ 2 + b ^ 2的任何因子,使得p ^ 2
这似乎是一种简单的O(n ^ 2)方法来生成所有毕达哥拉斯四边形,但没有明显的方法来利用d
被修复。
这是另一种O(n ^ 2)方法,它不需要数学洞察力,只需要一些基本的数据结构能力:
for(k=0; k<r; ++k)
insert r^2 - k^2 into BST [*]
for(i=0; i<r; ++i)
for(j=i; j<r; ++j)
if i^2 + j^2 is in BST report i,j,k [**]
[*]可以使用任何高速字典数据结构;二叉搜索树不是强制性的。但是,AA trees速度快且易于编码。
[**]从k ^ 2 = r ^ 2 - i ^ 2 - j ^ 2计算k
。
答案 2 :(得分:0)
尝试参数化,Wikipedia page提到其中2个。