しばらくPHPを使用した後、組み込みのすべてのPHP関数が期待どおりに高速であるとは限りません。キャッシュされた素数の配列を使用して、数値が素数であるかどうかを検出する関数のこれら2つの可能な実装を検討してください。
//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 );
}
これは、in_array
が$prime_array
増加するにつれて線形的に減速する線形検索O(n)で実装されているためです。ここで、array_key_exists
関数は、ハッシュテーブルは非常に移入されますない限り遅くしないであろうハッシュルックアップO(1)を用いて実施される(その場合、それが唯一のO(N))。
これまでのところ、試行錯誤を繰り返してBig-Oを発見し、たまにソースコードを確認する必要がありました。さて、質問です...
すべての組み込みPHP関数*の理論的な(または実用的な)ビッグO時間のリストはありますか?
*または少なくとも興味深いもの
:可能な実装は、PHPの未知のコアデータ構造に依存するため、例えば、私が記載されている機能の大きなOを予測することは非常に難しいそれを見つけるarray_merge
、array_merge_recursive
、array_reverse
、array_intersect
、array_combine
、str_replace
(配列入力を備えた)、など
true
、を使用して存在をテストすることで、最速の実装を実現できますisset($large_prime_array[$number])
。私の記憶が正しければ、in_array
関数よりも何百倍も高速です。
array_key_exists
、と比較していin_array
ます。in_array
配列の各項目を反復処理し、その値を、渡された針と比較します。値をキーにフリップすると(そして各値をのようなダミー値に置き換えるだけでtrue
、を使用するisset
と何倍も速くなります。これは、配列のキーが(ハッシュテーブルのように)PHPによってインデックス付けされるためです。この方法でアレイを配置すると、速度が大幅に向上します