Liste des Grands-O pour les fonctions PHP

Après l'utilisation de PHP pour un certain temps maintenant, j'ai remarqué que pas intégré toutes les fonctions PHP sont aussi rapide que prévue. Tenir compte de ces deux implémentations possibles d'une fonction qui détecte si un nombre est premier à l'aide d'un cache de tableau de nombres premiers.

//very slow for large $prime_array
$prime_array = array( 2, 3, 5, 7, 11, 13, .... 104729, ... );
$result_array = array();
foreach( $prime_array => $number ) {
    $result_array[$number] = in_array( $number, $large_prime_array );
}

//speed is much less dependent on size of $prime_array, and runs much faster.
$prime_array => array( 2 => NULL, 3 => NULL, 5 => NULL, 7 => NULL,
                       11 => NULL, 13 => NULL, .... 104729 => NULL, ... );
foreach( $prime_array => $number ) {
    $result_array[$number] = array_key_exists( $number, $large_prime_array );
}

C'est parce que in_array est mis en œuvre avec une recherche linéaire O(n) qui de façon linéaire ralentir $prime_array grandit. Où la array_key_exists fonction est implémentée avec une valeur de hachage de recherche O(1), qui ne sera pas ralentir à moins que la table de hachage devient extrêmement peuplée (dans ce cas, c'est seulement O(n)).

Jusqu'à présent, j'ai eu à découvrir le big-O par essai et erreur, et parfois en regardant le code source. Maintenant, pour la question...

S'il existe une liste de la partie théorique (et pratique) big O fois pour toutes* intégré dans les fonctions de PHP?

*ou au moins l'intéressantes

Par exemple, je trouve qu'il est très difficile de prédire le grand O de fonctions énumérées à cause de la possible mise en œuvre dépend de l'inconnu structures de données de base de PHP: array_merge, array_merge_recursive, array_reverse, array_intersect, array_combine, str_replace (avec un tableau en entrée), etc.

  • Totalement hors sujet, mais, 1 n'est pas premier.
  • Bon appel de Jason Punyon
  • Les tableaux en PHP sont les tables de hashage. Cela devrait vous dire tout ce que vous devez savoir. La recherche d'une clé dans une table de hachage est O(1). Recherche d'une valeur est O(n) -- ce que vous ne pouvez pas les battre sur un des ménagères de jeu. La plupart des fonctions que vous êtes curieux de savoir sont probablement O(n). Bien sûr, si vous voulez vraiment savoir, vous pouvez lire la source: cvs.php.net/viewvc.cgi/php-src/ext/standard/...
  • Pour l'enregistrement, la manière la plus rapide de mise en œuvre de ce que vous essayez de le faire serait de (au lieu d'utiliser la valeur NULL pour vos valeurs) utilisation true puis test de présence à l'aide d' isset($large_prime_array[$number]). Si je me souviens bien, c'est dans l'ordre de l'être des centaines de fois plus rapide que la in_array fonction.
  • mattbasta; si ce que vous dites est vrai, alors j'ai juste appris la chose la plus cool que j'ai appris toute la semaine.
  • ne serait-il pas toujours a la même big-O, mais simplement un plus petit coefficient?
  • Pas vraiment sûr, mais je l'ai utilisé et c'est FOU rapide.
  • Selon mes tests, la seule raison que isset est plus rapide, parce que c'est une structure du langage, et il y a un peu plus de la tête pour array_key_exists. Cette surcharge de travail, selon mon test pastebin.com/E9WtuzPb est que d'environ 50% (différence entre 0.0000006 et 0.0000004). Je crois que la raison isset peuvent être des ordres de grandeur plus rapide est parce qu'il cache recherches lorsque la clé est codée en dur, parce que c'est une construction du langage. Je pense que je vais encore le bâton avec array_key_exists car il n'a pas la valeur NULL gotcha.
  • Le Big O la notation n'est pas une question de vitesse. C'est à propos de la limitation de comportement.
  • Je ne suis pas le comparer à array_key_exists, je suis en comparant à in_array. in_array itération de chaque élément d'un tableau et compare la valeur de l'aiguille qui vous transmettez. Si vous retournez les valeurs de la clé (et il suffit de remplacer chacune des valeurs avec une valeur factice comme true, à l'aide de isset est beaucoup de beaucoup de fois plus rapide. C'est parce que les clés d'un tableau sont indexés par PHP (comme une table de hachage). Par conséquent, la recherche d'un tableau de cette manière peut avoir une amélioration significative de la vitesse.
  • Intéressant! Ainsi, une conversion rapide à utiliser la 2ème, plus rapide, est d'utiliser $prime_array = array_fill_keys( $prime_array, null ) . Ceci permet de clés dans les valeurs et maintenant, nous pouvons utiliser la fonction isset() à la place de in_array(). À partir de stackoverflow.com/questions/10641865/...
  • $array_of_number n'est pas défini ??