循环代码优化

3
如何优化以下代码?
我需要运行三个类似这样的循环:
for($i=1;$i<=$count-1;$i++){    
  for($j=$i+1;$j<=$count;$j++){
  // do some query use $i and $j

  }
}
for($i=1;$i<=$count-2;$i++){
   for($j=$i+1;$j<=$count-1;$j++){   
     for($k=$j+1;$k<=$count;$k++){
       // do some query use $i and $j and $k
     }
  }
}
for($i=1;$i<=$count-3;$i++){
   for($j=$i+1;$j<=$count-2;$j++){   
      for($k=$j+1;$k<=$count-1;$k++){
     for($l=$k+1;$l<=$count;$l++){ 
       // do some query use $i and $j and $k and $l
       }
     }
  }
}

有没有简化代码的方法,也许是将循环连接在一起?谢谢!

1
你真的必须那样做吗?嵌套的for循环总是很慢。如果重新构建算法,你可能可以更加优化。 - Felix Kling
$k1lk之后。;-) - Gumbo
哇,你的第三个循环就像O(n^4)一样。 - gblazex
2
发布“做某事”之后,您可能可以使用更少的循环来“做某事”,但是如果我们不知道您正在做什么,我们就无法提供帮助。 - IVlad
1
但是回答你的问题:只有当你知道如何处理循环时,才能对其进行优化。只有这样,你才能跳过一些步骤或重新组织迭代。 - gblazex
显示剩余2条评论
3个回答

2
这应该可以解决(未经测试):
for($i = 1; $i <= $count - 3; $i++) {
    for($j = $i + 1; $j <= $count; $j++) {
        // i,j query

        if($j > $count - 2) {
            continue;
        }

        for($k = $j + 1; $k <= $count; $k++) {
            // i,j,k query

            if($k > $count - 1) {
                continue;
            }

            for($l = $k + 1; $l <= $count; $l++) {
                // i,j,k,l query
            }
        }
    }
}

请注意,查询结果已经不再按照原始顺序排列。

正如所说,如果不知道正在运行的查询语句,就没有更好的优化方法了。


1

最大的问题是内部循环运行多次。您可以通过在循环内检查i === 1j === 2,并仅在为真时运行适当的代码来解决此问题。


3
我不明白如何实施它,如果您能具体说明,我将不胜感激。 - Haim Evgi

0
微优化: 使用
++$i

而不是

$i++

对于 $j++、$k++ 和 $l++ 的等效操作是什么?

但是在这些循环中你在做什么呢:完全有可能你所执行的某些查询(数据库?)可以被更改以完全消除这些循环... 这比任何微小的优化都要更有效。


4
这太可悲了。抱歉,但这怎么能成为被接受的答案呢? - strager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接