详尽的(蛮力)算法改进

Exhaustive (brute force) algorithm improvement

本文关键字:算法 蛮力      更新时间:2023-10-16

我从下面的要求开始:

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

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

无需内部循环;给定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
        }
    }
}

您不需要内部for z循环。拥有xy后,您可以轻松地确定zn-x-y。这使其成为O(N^2)

upd :我认为您甚至可以使用二进制搜索方法在O(N log N)中制作。

迭代x。对于给定的x,您需要找到y+z=n-xy^3+z^3=m-x^3yz。假设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,您可以在O(log N)时间中找到所需的y,这使O(N log N)总共运行时间。

这个是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;
      }
   }
}