在使用PHP一段时间后,我注意到并非所有内置PHP函数都像预期的那样快。考虑使用缓存的质数数组来判断一个数字是否是质数的函数的两种可能实现。
//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
是用线性搜索O(n)实现的,它将随着$prime_array
的增长而线性地减慢。其中array_key_exists
函数是通过哈希查找O(1)实现的,除非哈希表被大量填充(在这种情况下,它只有O(n)),否则哈希查找不会变慢。
到目前为止,我不得不通过反复试验来发现大o,偶尔也会发现查看源代码。现在问题来了……
是否有所有PHP内置函数的理论(或实际)大O时间列表?
*或者至少是有趣的
例如,我发现很难预测列出的函数的大O,因为可能的实现取决于PHP的未知核心数据结构:array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(带有数组输入)等。