2012-04-11 6 views
3

Existe-t-il un moyen d'optimiser ce morceau de code pour qu'il fonctionne plus rapidement? J'apprécierais toutes les suggestions!Optimisation des boucles de code en PHP

Ce morceau de code traite le transfert d'arêtes pendant la création du graphe.

foreach($times_arrival as $city_id => $time_points) { 
// if city is not prohibited for transfers and there is and exists any departure times for this city 
if (isset($times_departure[$city_id]) && isset($cities[$city_id])) 
{ 
    foreach($times_arrival[$city_id] as $t1_info) 
    { 
     foreach($times_departure[$city_id] as $t2_info) 
     { 
      if ($t1_info[0] != $t2_info[0]) //transfers are allowed only for different passages 
      { 
       $t1 = $t1_info[1]; 
       $t2 = $t2_info[1]; 

       $vertex_key = new Vertex($city_id, $t1, 1); 
       $vertex_key = $vertex_key->toString(); 

       //minimum transfer time is 10 min. 
       if (date('H:i', strtotime($t2)) > date('H:i', strtotime('+ 10 minutes', strtotime($t1)))) 
       { 
        $this->graph[$vertex_key][] = new Edge(
         NULL, 
         $vertex_key, 
         new Vertex($city_id, $t2, 0), 
         (float) 0, 
         $f((strtotime($t2) - strtotime($t1))/60, 0, 1) //edge weight 
        ); 
       } 
       //if transfer is on the bound of the twenty-four hours 
       else if (date('H:i', strtotime('+ 24 hours', strtotime($t2))) > date('H:i', strtotime('+ 10 minutes', strtotime($t1)))) 
       { 
        $this->graph[$vertex_key][] = new Edge(
         NULL, 
         $vertex_key, 
         new Vertex($city_id, $t2, 0), 
         (float) 0, 
         $f(strtotime('+ 24 hours', strtotime($t2)) - strtotime($t1)/60, 0, 1) //edge weight 
        ); 
       } 
      } 
     } 
    } 
} 
} 

exemple de variables:

var_dump($times_arrival); //$times_departure have the same structure 
array 
    3 => 
    array 
     0 => 
     array 
      0 => string '1' (length=1) 
      1 => string '08:12' (length=5) 
     1 => 
     array 
      0 => string '2' (length=1) 
      1 => string '08:40' (length=5) 
    41 => 
    array 
     0 => 
     array 
      0 => string '21' (length=2) 
      1 => string '12:40' (length=5) 
+0

Wow! 'foreach (foreach (foreach ($ foo => $ bar)))' –

+1

Publiez des données '$ times_arrival', s'il vous plaît. –

+0

@GabrielSantos mis à jour. – Yekver

Répondre

0

Merci à tous! La raison de la vitesse lente était coz d'utiliser les fonctions strtotime() et date().

-1

Dans ce cas, vous seul pouvez dire si vous avez choisi un bon ou mauvais algorithme. De mon point de vue, votre code n'a pas de calculs supplémentaires.

Une seule recommandation - utilisez Xdebug pour profiler votre code et savoir où se trouve le goulot d'étranglement, si possible.

+0

À tout le moins, il est susceptible de faire un pré-traitement sur ses nœuds, ce qui abaissera son big-O attendu de ~ O (n^3) à O (n^2), ou peut-être O (nlogn), selon sur ce qu'il doit faire exactement. –

+0

Maintenant c'est O (n^2) pas n^3 et possible de le diminuer à O (nlogn) ou pas comment je et vous dites "en fonction de ce qu'il a à faire exactement". Mais ce ne sont pas des mathématiques propres - son programme et possible peut être finalement accélérer par optimisation de code mais pas d'algorithme. – user1303559

+0

C'est techniquement O (m * n^2), où n est la longueur du tableau d'arrivée et m est la longueur du tableau de départ. Nous le savons car il existe trois boucles for-imbriquées. Je vous garantis qu'il y a un moyen plus rapide de faire cela de manière algorithmique, s'il peut poster des clarifications sur ses données. –