2010-07-06 5 views
3

Comment puis-je optimiser le code suivant,Code de boucle d'optimisation

Je dois exécuter 3 séries de boucles comme ceci:

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

est-il un moyen de simplifier le code, peut-être pour relier les boucles ensemble ?

merci!

+1

Faut-il vraiment le faire de cette façon? Les boucles imbriquées sont toujours lentes. Vous pouvez probablement encore plus optimiser si vous restructurez votre algorithme. –

+0

'$ k1'? * l * vient après * k *. ;-) – Gumbo

+0

omg, votre troisième boucle est comme O (n^4) – galambalazs

Répondre

0

Micro-optimisation: Utilisez

++$i 

plutôt que

$i++ 

et équivalent pour $ j ++, k $ ++ et $ l ++

Mais que faites-vous dans ces boucles: Il est tout à fait possible que votre requête (base de données?) soit modifiée pour supprimer complètement les boucles ... et ce serait beaucoup plus efficace que toute micro-optimisation

+4

Ceci est juste ** pathétique **. Désolé, mais comment est-ce la réponse acceptée? – strager

1

Le gros problème est que les boucles internes sont exécutées plusieurs fois. Vous pouvez contourner ceci en vérifiant i === 1 et j === 2 à l'intérieur des boucles et en exécutant seulement le code approprié si vrai.

+3

Je n'ai pas compris comment l'implémenter, je vous serais reconnaissant si vous pouviez spécifier –

2

Cela devrait le faire (non testé):

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

Notez que les requêtes ne sont plus dans leur ordre d'origine.

Comme il a été dit, il n'y a aucun moyen d'optimiser cela sans connaître les requêtes que vous exécutez.