2010-07-06 90 views
3

如何优化下面的代码,循环代码优化

我需要运行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循环总是很慢。如果重构算法,你可能会更加优化。 – 2010-07-06 10:11:51

+0

'$ k1'? * l *在* k *之后。 ;-) – Gumbo 2010-07-06 10:13:28

+0

omg,你的第三个循环就像O(n^4) – galambalazs 2010-07-06 10:14:38

回答

0

微优化: 使用

++$i 

而不是

$i++ 

和等效于$ J ++,$ķ++和$ L ++

但你在这些循环做:完全有可能你可以改变一些查询(数据库?)以完全删除循环......并且这将比任何微优化更有效

+4

这只是**可怜**。对不起,这是如何被接受的答案? – strager 2010-08-16 07:22:31

1

最大的问题是内循环运行多次。您可以通过在循环内检查i === 1j === 2来解决这个问题,并且只有运行适当的代码(如果为true)。

+3

我不明白如何实现它,我会很感激,如果你可以指定 – 2010-07-06 10:21:58

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 
      } 
     } 
    } 
} 

注意,查询是在原来的顺序不再。

正如之前所说,如果不知道正在运行的查询,就无法进一步对其进行优化。