थोड़ी देर के लिए PHP का उपयोग करने के बाद, मैंने देखा है कि सभी अंतर्निहित PHP फ़ंक्शन अपेक्षा के अनुरूप तेज़ नहीं हैं। एक फ़ंक्शन के इन दो संभावित कार्यान्वयनों पर विचार करें, जो पाता है कि क्या कोई संख्या primes के कैश्ड सरणी का उपयोग कर रही है।
//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) के साथ कार्यान्वित किया जाता है जो कि रैखिक रूप से $prime_array
बढ़ता हुआ धीमा हो जाएगा । जहां array_key_exists
फ़ंक्शन को हैश लुकिंग O (1) के साथ कार्यान्वित किया जाता है जो तब तक धीमा नहीं होगा जब तक कि हैश तालिका अत्यंत आबादी वाली न हो (जिस स्थिति में यह केवल O (n) है)।
अब तक मुझे परीक्षण और त्रुटि के माध्यम से बिग-ओ की खोज करनी थी, और कभी-कभी स्रोत कोड को देखना पड़ता था । अब सवाल के लिए ...
क्या सभी * अंतर्निहित PHP कार्यों के लिए सैद्धांतिक (या व्यावहारिक) बड़े ओ समय की सूची है?
* या कम से कम दिलचस्प हैं
उदाहरण के लिए, मैं सूचीबद्ध कार्यों का बड़ा हे भविष्यवाणी करने के लिए यह बहुत मुश्किल है क्योंकि संभव कार्यान्वयन 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 द्वारा अनुक्रमित की जाती है (जैसे हैशटेबल की तरह)। इस तरह से एक सरणी में गति में एक महत्वपूर्ण सुधार हो सकता है।