के साथ क्विकॉर्टोर्ट बिल्डिंग मैंने हाल ही में क्विकॉर्ट के बारे में पढ़ा और यह सोच रहा था कि क्या यह QuickSort के साथ चीजों को सॉर्ट करने के लिए अपने स्वयं के फ़ंक्शन को बनाने के लिए स्मार्ट होगा या यदि यह अक्षम होगा। एक आत्मनिर्भर Quicksort समारोह से बेहतर तरीके से बनाया गया काम क्या लगता है?php
php
उत्तर
नोट
: अधिकांश PHP सॉर्टिंग फ़ंक्शंस की तरह, सॉर्ट() 0 Qu35ort के कार्यान्वयन का उपयोग करता है।
कोर PHP फ़ंक्शन PHP के बजाय सी में लागू किए जाएंगे, इसलिए उन्हें आमतौर पर PHP में स्वयं को लिखने वाले किसी भी चीज़ से काफी तेज़ होना चाहिए। ऐसे मामले होंगे जहां यह स्वयं लिखना तेज़ होगा, लेकिन मुझे लगता है कि यह तब होगा जब आपके पास एक बहुत ही विशिष्ट मामला है और आप इसके लिए अपने विशिष्ट अनुकूलन कर सकते हैं। मुझे लगता है कि यहां मामला होने की संभावना नहीं है।
बिल्ट-इन सॉर्ट फ़ंक्शन के साथ चिपकाएं। क्विक्सोर्ट एक साधारण एल्गोरिदम है, लेकिन वास्तव में उपयोग में आने वाले कंप्यूटरों पर अच्छा प्रदर्शन पाने के लिए थोड़ी सी चीज की आवश्यकता होती है। यह संभावना से अधिक है कि अंतर्निहित फ़ंक्शन पहले से ही उचित समय में लिखने वाली किसी भी चीज़ से अधिक अनुकूलित है। (PHP के बजाय सी में लिखे जाने से निरंतर-कारक गतिशीलता भी सहायक है।)
यदि आप सॉर्ट फ़ंक्शन द्वारा धीमे हो गए हैं तो आप बहुत से तत्वों को सॉर्ट कर रहे हैं, तो आप शायद कुछ गलत कर रहे हैं। (यह पीएचपी सब के बाद है। आप डेटा-गहन प्रसंस्करण के लिए एक सामान्य प्रयोजन भाषा का उपयोग करना चाहिए। यह आसान हो जाएगा अपने कोड लिखने के लिए, और यह तेजी से चलने लगेंगे।)
असल में मैंने इसे एक प्रेजेंटेशन पर डेटा पॉइंट के लिए किया जो मैं एक साथ रख रहा हूं। परीक्षण मूल प्रकार के फ़ंक्शन का उपयोग करके 250,000 पूर्णांकों की एक सरणी और php में लिखे गए क्विकॉर्ट एल्गोरिदम के क्रियान्वयन को टाइप करता है। सरणी की सामग्री दोनों रनों के लिए बिल्कुल समान होती है, डेटा यादृच्छिक होता है, और रिपोर्ट की गई समय केवल इस तरह के प्रदर्शन के लिए होती है, न कि php दुभाषिया को आमंत्रित करने के लिए आवश्यक अन्य प्रसंस्करण।
परिणाम:
Native sort implementation: 1.379 seconds PHP quicksort implementation: 30.615 seconds
निश्चित रूप से देशी कार्यान्वयन का उपयोग करें। यह किसी भी व्याख्या की गई भाषा के लिए मामला होना चाहिए।
अन्य भाषाओं मैं एक ही स्थिति में एक ही हार्डवेयर और OS पर एक ही कार्यान्वयन का उपयोग के साथ परीक्षण के लिए परिणाम, एक दिलचस्प प्रदर्शन की तुलना प्रदान करते हैं और परिप्रेक्ष्य में पीएचपी परिणाम डाल:
C: 0.107 seconds Java: 0.250 seconds JavaScript (FF3): 4.401 seconds
विशेष रूप से, क्रोम और सफारी ने जावास्क्रिप्ट परीक्षण के लिए अधिक तेज प्रदर्शन किया, लेकिन मुझे उन लोगों को शामिल नहीं किया गया क्योंकि उन परीक्षणों को एक अलग वातावरण में दर्ज किया गया था। php त्वरित प्रकार (asort, arsort, आदि) के बारे में
http://en.wikibooks.org/wiki/Algorithm_implementation/Sorting/Quicksort#C.23
संदर्भ के लिए यहाँ एक PHP कार्यान्वयन है अलग-अलग चाबियाँ अलग-अलग रनों के बीच भी यादृच्छिक रूप से स्वैप स्थिति के साथ होंगी। आश्चर्यजनक है कि कोड बार-बार एक ही डेटा का उपयोग करके एक अलग क्रम उत्पन्न कर सकता है। अंत में मुझे इस विसंगति को दूर करने के लिए अपने स्वयं के त्वरित प्रकार को लागू करना पड़ा।
एक बात यह है कि वे गंदगी अपने बराबर मान, कि है कि मूल्यों में कहने के लिए है:
बस मस्ती के लिए, यहां PHP में क्विकॉर्ट का एक जगह है जहां मैं आया था। यहां एक चाल के रूप में क्रमबद्ध करने के लिए सरणी को पारित करना है।
function partition(&$arr,$leftIndex,$rightIndex)
{
$pivot=$arr[($leftIndex+$rightIndex)/2];
while ($leftIndex <= $rightIndex)
{
while ($arr[$leftIndex] < $pivot)
$leftIndex++;
while ($arr[$rightIndex] > $pivot)
$rightIndex--;
if ($leftIndex <= $rightIndex) {
$tmp = $arr[$leftIndex];
$arr[$leftIndex] = $arr[$rightIndex];
$arr[$rightIndex] = $tmp;
$leftIndex++;
$rightIndex--;
}
}
return $leftIndex;
}
function quickSort(&$arr, $leftIndex, $rightIndex)
{
$index = partition($arr,$leftIndex,$rightIndex);
if ($leftIndex < $index - 1)
quickSort($arr, $leftIndex, $index - 1);
if ($index < $rightIndex)
quickSort($arr, $index, $rightIndex);
}
php में ऐसा करना बहुत धीमा है - इस समस्या को हल करने के बेहतर तरीके हैं। – Chronial