2010-04-20 3 views
-2

Maintenant vient la partie difficile. Comment optimiser cette fonction:Optimisation de code de fonction personnalisée PHP

function coin_matrix($test, $revs) { 
    $coin = array(); 

    for ($i = 0; $i < count($test); $i++) { 
     foreach ($revs as $j => $rev) { 
      foreach ($revs as $k => $rev) { 
      if ($j != $k && 
       $test[$i][$j] != null && 
       $test[$i][$k] != null) { 
        if(!isset($coin[$test[$i][$j]])) { 
         $coin[$test[$i][$j]] = array(); 
        } 
        if(!isset($coin[$test[$i][$j]][$test[$i][$k]])) { 
         $coin[$test[$i][$j]][$test[$i][$k]] = 0; 
        } 

        $coin[$test[$i][$j]][$test[$i][$k]] += 1/($some_var - 1); 
       } 
      } 
     } 
    } 
    return $coin; 
} 

Je ne suis pas bon à cela et si les tableaux sont grandes, il fonctionne toujours.

La fonction est censée trouver toutes les paires de valeurs d'un tableau à deux faible et les résumer comme ceci: $coin[$i][$j] += sum_of_pairs_in_array_row/[count(elements_of_row) - 1]

Merci beaucoup!

+0

Je suis juste essayer d'apprendre, mais merci pour le vote vers le bas de toute façon. – Alex

+1

Qu'est-ce que cette fonction est censée faire? Parfois, un échantillon de code va loin, mais parfois une description claire en anglais va encore plus loin. – Matchu

+0

Qu'est-ce que c'est censé faire? – animuson

Répondre

1

Si vous avez vraiment besoin d'exécuter toutes les combinaisons de 3 éléments dans la matrice, vous êtes la plupart du temps coincé lorsqu'il s'agit de grandes baies. Le facteur principal sera le fait que votre fonction est cubique - vous ne pouvez rien faire sur le fait que, à mesure que l'entrée augmente, le temps de sortie augmente astronomiquement. Vous pourriez être en mesure de réduire le temps de, disons, 30% de ce qu'il est maintenant, mais si le temps est déjà de 3 semaines, 1 semaine d'exécution fait peu pour vous. Ceci étant dit, vous pouvez toujours vous épargner quelques efforts dans la boucle la plus intérieure. Si j'interprète votre code correctement, vous pouvez définir $coin[$i][$j] = array() une seule fois par combinaison i-j, plutôt que de vérifier chaque élément k qu'il n'a pas encore défini.

Cela aussi dit, il est toujours pas tout à fait clair que la fonction est supposé faire, donc je ne peux pas offrir exactement d'autres modifications avec confiance autre que d'utiliser $coin au lieu de coin, pour enregistrer l'analyseur PHP un peu d'effort.

+0

C'est une faute de frappe.corrigé – Alex

+1

Il en reste deux, dans les instructions if. – Matchu

+0

oui, merci! corrigé aussi. voir dans les commentaires ci-dessus pour la description de la formule derrière la fonction – Alex

0

Je ne sais pas pourquoi cela n'a pas été fait plus tôt: Changement:

for ($i = 0; $i < count($test); $i++) { 

Pour:

$count = count($test); 
for ($i = 0; $i < $count; $i++) { 

vous permettra d'économiser un certain temps. (Plus si $ test est plus grand)

Je ne suis pas sûr si cela est juste, mais ce serait causer tout un ralentissement alors que le $ some_var n'existe pas:

$coin[$test[$i][$j]][$test[$i][$k]] += 1/($some_var - 1); 

Enfin, je Je ne sais toujours pas ce que c'est censé faire. Peut-être que vous pouvez fournir de bonnes valeurs d'entrée et de sortie. Comme votre but déclaré n'a toujours pas de sens. Quelle est $ régime moteur, pourquoi est-il:

$coin[$i][$j] += sum_of_pairs_in_array_row/[count(elements_of_row) - 1] 

au lieu de:

$coin[$row] += sum_of_pairs_in_array_row/[count(elements_of_row) - 1] 
+0

il calcule une matrice de coïncidence pour l'alpha de Krippendorff. La formule exacte pour chaque élément de la matrice que la fonction est supposée renvoyer est ici: http://bit.ly/bS9a92 (lien wikipedia). $ Test est une matrice bidimensionnelle, $ revs est un vecteur et les clés de $ revs coïncident avec le numéro de ligne de $ test – Alex