在使用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)来实现,线性搜索O(n)随$prime_array
增长线性降低。该array_key_exists
函数是用哈希查找O(1)来实现的,除非哈希表被填充得足够多(在这种情况下,它只是O(n)),否则它将不会减慢速度。
到目前为止,我不得不通过反复试验来发现big-O,并偶尔查看源代码。现在问题...
是否有所有*内置PHP函数的理论(或实践)大O时间列表?
*或至少是有趣的
举例来说,我觉得很难预测的上市功能的大O,因为可能的实现依赖于PHP的核心未知数据结构: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索引(如哈希表)。以这种方式的阵列可以以速度有显著改善。