array_sum 在 PHP 中使用啥算法?

Posted

技术标签:

【中文标题】array_sum 在 PHP 中使用啥算法?【英文标题】:What algorithm does array_sum use in PHP?array_sum 在 PHP 中使用什么算法? 【发布时间】:2014-09-20 21:21:08 【问题描述】:

array sum 使用什么算法使它比一些循环更快?

是前缀总和/后缀总和还是别的什么?

【问题讨论】:

我也必须是线性算法,但是 php 内在函数(即 PHP 中直接可用的所有函数)执行得更快 基本上与您编写循环来实现的算法相同,但它作为直接编译的 C 代码执行,而不是 PHP 【参考方案1】:

算法很简单:只需遍历数组并产生元素的总和。而已。就算法而言,没有什么好说的了。显然,你会像O(n) 那样复杂。

然而,PHP array_sum() 是编译后的 C 代码,因此会比用户级函数更快。另外,如果您对它的内部运作方式感兴趣,可以查看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。

【讨论】:

你赢了,忍者大师。 感谢您的出色回答。【参考方案2】:

它使用与在 PHP 中编写循环相同的算法(即 O(n) 线性解决方案),除了在大多数情况下,因为它是本机代码(用 ie C 编写)而不是解释,它直接在 CPU 上运行,而不是通过虚拟机(慢 10 到 100 倍)。

【讨论】:

【参考方案3】:

它使用Big-O O(n) 优化。您可能想在这里查看excellent answer。您也可以使用Eureqa等软件自行检查大部分内容

【讨论】:

“big O”绝不是 OP 要求的“算法” @raidenace :非常感谢,非常有价值的信息。

以上是关于array_sum 在 PHP 中使用啥算法?的主要内容,如果未能解决你的问题,请参考以下文章

php概率算法(转)

php 概率算法(转)

PHP使用啥排序算法?

PHP几个常用的概率算法

微信开发PHP中奖概率经典算法实例

学习笔记