彻底(强力)算法改进

时间:2015-05-12 13:35:20

标签: c++ algorithm

我从以下要求开始:

m,n是整数。用

搜索(x,y,z)
  • X + Y + Z = N
  • x ^ 3 + y ^ 3 + z ^ 3 = m

我的代码

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

使用上面的块代码,算法非常慢。你知道如何提高速度吗?

3 个答案:

答案 0 :(得分:3)

不需要内环;给定xy,您可以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循环。获得xy后,您可以轻松地将z确定为n-x-y。这使它成为O(N^2)

UPD :我认为您甚至可以使用二分搜索方法进入O(N log N)

迭代x。对于给定的x,您需要找到yz这样的y+z=n-xy^3+z^3=m-x^3。假设n'=n-zm'=m-x^3

问题与yz对称,因此我们可以安全地假设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;
      }
   }
}