我从以下要求开始:
m,n是整数。用
搜索(x,y,z)我的代码
for(int x = 1; x<n; x++)
{
for(int y = 1; y<n; y++)
{
for(int z=1; z<n; z++)
{
if((x*x*x + y*y*y + z*z+z*z == m) &&(x+y+z==n))
{
cout<<x<<" "<<y<<" "<<z;
}
}
}
}
BigO = n ^ 3
使用上面的块代码,算法非常慢。你知道如何提高速度吗?
答案 0 :(得分:3)
不需要内环;给定x
和y
,您可以z = n-x-y
。这会将其降低为O(n^2)
。
第二个循环只需要在x+y<n
循环,因为除此之外没有正z
这样x+y+z==n
。这使剩余的工作减少了一半。
一旦你完成了这项工作,就没有必要进行第二次测试(因为你已经选择z
来做到这一点);修复第一次测试中的拼写错误
for (int x = 1; x<n; x++) {
for (int y = 1; x+y<n; y++) {
int z = n-x-y;
if (x*x*x + y*y*y + z*z*z == m) {
// found it
}
}
}
答案 1 :(得分:1)
您不需要内部for z
循环。获得x
和y
后,您可以轻松地将z
确定为n-x-y
。这使它成为O(N^2)
。
UPD :我认为您甚至可以使用二分搜索方法进入O(N log N)
。
迭代x
。对于给定的x
,您需要找到y
和z
这样的y+z=n-x
和y^3+z^3=m-x^3
。假设n'=n-z
和m'=m-x^3
。
问题与y
和z
对称,因此我们可以安全地假设y<=z
。这使y<=n'/2
。
我们需要找到y
这样的y^3+(n'-y)^3=m'
。我几乎肯定(虽然没有检查过)函数f(y)=y^3+(n'-y)^3
在[1, n'/2]
区间内是单调的,因此您可以使用二分查找来找到f(y)=m'
方程的根。
因此,对于给定的x
,您可以在y
时间内找到所需的O(log N)
,这会使O(N log N)
的运行时间合计。
答案 2 :(得分:0)
这个是O(n ^ 2)
for(int x = 1; x<n; x++)
{
int n1 = n - x ;
for(int y = 1; y<n1; y++)
{
int z = n - x - y ;
if (x*x*x + y*y*y+z*z*z==m)
{
cout<<x<<" "<<y<<" "<<z;
}
}
}