数组和使用什么算法使它比某些循环更快?
它是前缀sum / suffix sum还是别的?
答案 0 :(得分:5)
算法很简单:只需遍历数组并生成元素的总和。而已。就算法而言,没有什么可以说的了。显然,你的复杂性为O(n)
。
然而,PHP array_sum()
是一个已编译的C代码,因此,它将比user-land函数更快。此外,如果您对内部工作方式感兴趣,可以查看array_sum()
implementation:
for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &pos);
zend_hash_get_current_data_ex(Z_ARRVAL_P(input), (void **)&entry, &pos) == SUCCESS;
zend_hash_move_forward_ex(Z_ARRVAL_P(input), &pos)
) {
if (Z_TYPE_PP(entry) == IS_ARRAY || Z_TYPE_PP(entry) == IS_OBJECT) {
continue;
}
entry_n = **entry;
zval_copy_ctor(&entry_n);
convert_scalar_to_number(&entry_n TSRMLS_CC);
fast_add_function(return_value, return_value, &entry_n TSRMLS_CC);
}
(我只留下了循环部分)。还有fast_add_function()
asm优化,您可以查看它的实现here。
答案 1 :(得分:1)
它使用与在PHP中编写循环相同的算法(即O(n)线性解决方案),除了在大多数情况下,因为它是本机代码(用C编写)而不是解释,它直接在CPU上运行而不是通过虚拟机(速度慢10到100倍)。
答案 2 :(得分:0)
它使用Big-O O(n)
优化。您可能希望在此处查看此excellent answer。您也可以使用Eureqa