我目前正在编写一本关于简单优化的书。 显示的算法之一是:
将所有溶液打印到 3 + b 3 = c 3 + d 3 (其中a, b,c,d小于 1000)
(我选择了100,所以它会在我的慢速上网本上运行得更快)
I programmed up their solution(包括他们的解决方案及其首次提供的优化),但提供的中断优化实际上使算法慢了一点。
public static void doUnoptimised() {
for(int a = 1; a < 100; a++)
{
for(int b = 1; b < 100; b++)
{
for(int c = 1; c < 100; c++)
{
for(int d = 1; d < 100; d++) {
if(Math.pow(a, 3) + Math.pow(b, 3) == Math.pow(c, 3) + Math.pow(d, 3))
{
System.out.println("A:" + a + " B:" + b + " C:" + c + " D:" + d);
}
}
}
}
}
}
public static void doFirstOptimised() {
for(int a = 1; a < 100; a++)
{
for(int b = 1; b < 100; b++)
{
for(int c = 1; c < 100; c++)
{
for(int d = 1; d < 100; d++) {
if(Math.pow(a, 3) + Math.pow(b, 3) == Math.pow(c, 3) + Math.pow(d, 3))
{
System.out.println("A:" + a + " B:" + b + " C:" + c + " D:" + d);
break;
}
}
}
}
}
}
为什么?请注意,这不是我的解决方案,这是本书中显示的解决方案,后来他们继续进行更多优化,但我对为什么这种优化是如此史诗般的失败感兴趣。
编辑 - 也许我在这里不够清楚。我知道这是一个几乎没有明显的变化,我理解为什么这是一个改进,并已经经历了书中提供的更好的优化。 (感谢那些给予更好的优化的人,感谢他们的努力)然而,这个特殊的步骤根本不起作用,我试图找出原因。但在这个阶段,我的jvm似乎很奇怪。
答案 0 :(得分:0)
此优化中假设d
,a
和b
的任意组合只有一个c
。
break;
所做的是停止内循环,所以一旦我们有了解决方案,我们就可以放弃寻找另一个解决方案,这可以节省工作量,从而减少时间。
有许多更好的优化,但是使用这样的break;
,或者return
是在较少设计的情况下使用的常见优化。
例如,如何实现ArrayList.indexOf天真地忽略null
值。
public int indexOf(Object o) {
int index = -1;
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
if (index == -1)
index = i;
return index;
}
注意:这必须扫描每个条目,即使它是第一个要找到的条目。更快的方法是用break来说;如果我有解决方案,请停止迭代。
public int indexOf(Object o) {
int index = -1;
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
index = i;
break;
}
return index;
}
但是,这里不需要休息,因为接下来的事情是return
public int indexOf(Object o) {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
return -1;
}
考虑到null
值,实际的实现是
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}