详尽的(蛮力)算法改进
Exhaustive (brute force) algorithm improvement
我从下面的要求开始:
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
使用上面的块代码,该算法非常慢。您是否知道如何提高速度?
无需内部循环;给定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
}
}
}
您不需要内部for z
循环。拥有x
和y
后,您可以轻松地确定z
为n-x-y
。这使其成为O(N^2)
。
upd :我认为您甚至可以使用二进制搜索方法在O(N log N)
中制作。
迭代x
。对于给定的x
,您需要找到y+z=n-x
和y^3+z^3=m-x^3
的y
和z
。假设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
,您可以在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;
}
}
}
相关文章:
- 我的C++语言蛮力算法有问题
- 用蛮力解方程
- 蛮力任务的空输出
- 捕获雨水:蛮力方法中的错误
- 蛮力C 控制台屏幕输入
- 如何使用不完整的图表实施蛮力旅行推销员
- 为什么我的Cooley-Tukey和蛮力(傅立叶)算法给出的结果非常不同
- 我的基本蛮力计划遇到了麻烦.具体的类功能
- 蛮力背包的C 一部分
- 详尽的(蛮力)算法改进
- 为什么我的蛮力MD5黑客不起作用
- 如何在没有蛮力的情况下找到矩阵中元素的计数?我们能做到吗?
- 蛮力置换交换
- c++蛮力程序很慢
- 蛮力攻击项目
- 最大子数组蛮力法对第一个数组产生较大的总和
- 欧拉项目蛮力选择每条路径
- 滑动最大窗口蛮力方法
- 反转给定(小)输入长度的 SHA-1 或 MD5,无需蛮力
- c++中带线程的蛮力搜索算法并行化