count()
是否确实计算了PHP数组的所有元素,还是将此值缓存到某处并仅检索?对于数组,PHP的count()函数是O(1)还是O(n)?
回答
好了,我们可以看看源:
/ext/standard/array.c
PHP_FUNCTION(count)
电话php_count_recursive()
,这反过来又非递归阵列,这是这种方式实现来电zend_hash_num_elements()
:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
所以你可以看到,它的为。
在PHP 5+中,长度存储在数组中,因此每次都不会进行计数。
编辑:你也可能会发现这个分析有趣:PHP Count Performance。虽然阵列的长度由阵列维护,但如果您打算多次呼叫count()
,似乎仍然保持较快。
我认为你可能是正确的,从PHP 5开始的变化。 但是,我还没有找到证明PHP 4是O(n)count();我只看到轶事评论。你能找到证明(例如PHP 4的count()实现)吗?谢谢, – 2016-01-16 00:46:06
PHP在内部存储数组的大小,但是如果你正在做一些类似的事情时,你仍然在做一个函数调用,哪一个比不做一个调用要慢,所以你需要将结果存储在一个变量中在循环中使用它:
例如,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
此外,你不能始终确保count
被称为阵列上。例如,如果在实现Countable
的对象上调用该对象,则将调用该对象的count
方法。
作为一个后续行动,你可能想要阅读http://josephscott.org/archives/2010/01/php-count-performance/它基本上详细说明如何获得数组长度为o(1)以及重复的函数调用。 – TheClair 2011-04-29 17:32:51
正在做一个函数调用总是比不做一个更慢?我不会惊讶地发现解释器有内联优化。 – corsiKa 2011-04-29 17:34:11
'这个对象的计数方法将被称为',如果一个类实现了'Countable'接口,然后调用'count($ object)'和调用'$是同一件事的话,你可以这样解释一下 – 2014-08-02 09:09:40
- 1. 是O(n^2)还是O(1)?
- 2. 这个函数是O(N + M)还是O(N * M)?
- 3. 是a.insert(0,x)和o(n)函数吗? a.append是一个O(1)函数吗? Python
- 4. 下面的函数是O(n)时间和O(1)空间,其中n = | A |?
- 5. 我应该考虑memmove()O(n)还是O(1)?
- 6. clojure subvec O(n)而不是O(1)?
- 7. Big O - O(N^2)or O(N^2 + 1)?
- 8. 这段代码是O(n)还是O(logn)?
- 9. 当一个std :: vector对象处于堆栈而另一个处于堆中时,向量交换函数的时间复杂度是O(1)还是O(n)?
- 10. 是string.ElementAt()O(1)?
- 11. 证明给定函数等于O(N)
- 12. 为什么这个函数/循环O(log n)而不是O(n)?
- 13. 使用Mergesort,quicksort等时,是O(n log n)基数2还是基数10?
- 14. 复杂度O(log(n))是否等于O(sqrt(n))?
- 15. 是C++语句的大-O'delete [] Q;' O(1)或O(n)?
- 16. 大O符号 - 为什么是O(n^2/4)= O(N^2)
- 17. 大O符号 - O(n日志(N))对O(的log(n^2))
- 18. O(nlogn)+ O(n),O(nlogn)和O(nlogn + n)之间的关系是什么?
- 19. 是log(n!)= O((log(n))^ 2)?
- 20. 实际上是链接列表添加O(N)或O(1)?
- 21. O(n^2)中是O(mn)吗?
- 22. Python的sort()/ sorted()函数是否调用其可选的'key'参数O(n)次或O(n log n)次?
- 23. 这个解决方案的时间复杂度是O(N)还是O(LogN)?
- 24. 查找一个数组是否是O(n)时间和O(1)空间的序列
- 25. Boost Pool free效率O(n)or O(1)
- 26. 这是用于计算数组O(n)复数中的倒数的算法吗?
- 27. 计数no。 O(n)
- 28. O(log_2(n))= O(log_10(n))?
- 29. 对于i的复杂性是什么:对于o = i + 1
- 30. 这个函数对于大O的内存需求是什么?
为什么不测试它?它足够简单,可以做一个循环,将元素添加到数组中并每次计算并执行一些计时。 – 2011-04-29 17:26:47
看看这个问题:http://stackoverflow.com/questions/2473989/list-of-big-o-for-php-functions – 2011-04-29 17:29:25
谷歌关键字 - 这个问题也可以表述为:PHP count()迭代数组还是从数组属性检索计数? – 2015-09-01 12:07:41