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