यह मेरे लिए समझ में आता है कि यह एक समस्या को हल करने के लिए तेजी से बनाता है अगर दो हिस्सों में पूरे डेटा सेट के साथ काम करने का आधे से भी कम समय लगता है।
यह डिवाइड-एंड-कॉनकोर एल्गोरिदम का सार नहीं है। आमतौर पर मुद्दा यह है कि एल्गोरिदम "पूरे डेटा सेट के साथ सौदा नहीं कर सकता है"। इसके बजाय, इसे उन टुकड़ों में विभाजित किया जाता है जो हल करने के लिए तुच्छ होते हैं (जैसे दो संख्याओं को छांटना), फिर उन्हें तुच्छ रूप से हल किया जाता है और परिणाम एक तरह से पुनर्संयोजित होते हैं जो पूर्ण डेटा सेट के लिए एक समाधान देता है।
लेकिन डेटा सेट को तीन भागों में विभाजित क्यों नहीं किया जाता है? चार? n?
मुख्य रूप से क्योंकि यह दो से अधिक भागों में विभाजित होता है और दो से अधिक परिणाम पुनर्संयोजित करता है जिसके परिणामस्वरूप अधिक जटिल कार्यान्वयन होता है लेकिन एल्गोरिथ्म की मूलभूत (बिग ओ) विशेषता को नहीं बदलता है - अंतर एक स्थिर कारक है, और इसके परिणामस्वरूप मंदी हो सकती है यदि 2 से अधिक सबसेट का विभाजन और पुनर्संयोजन अतिरिक्त उपरि बनाता है।
उदाहरण के लिए, यदि आप 3-वे मर्ज सॉर्ट करते हैं, तो पुनर्संयोजन चरण में अब आपको हर तत्व के लिए 3 तत्वों में से सबसे बड़ा खोजना होगा, जिसके लिए 1 के बजाय 2 तुलनाओं की आवश्यकता होती है, इसलिए आप समग्र रूप से दो बार तुलना करेंगे। । बदले में, आप ln (2) / ln (3) == 0.63 के एक कारक द्वारा पुनरावृत्ति की गहराई को कम करते हैं, इसलिए आपके पास 37% कम स्वैप हैं, लेकिन 2 * 0.63 == 26% अधिक तुलना (और मेमोरी एक्सेस)। चाहे वह अच्छा हो या बुरा यह निर्भर करता है कि आपके हार्डवेयर में कौन अधिक महंगा है।
मैंने 3-वे क्विकसॉर्ट के कई संदर्भ भी देखे हैं। यह तेज कब है?
जाहिरा तौर पर क्विकॉर्ट के दोहरे पिवट वेरिएंट को समान संख्या में तुलना की आवश्यकता साबित हो सकती है, लेकिन औसतन 20% कम स्वैप, इसलिए यह शुद्ध लाभ है।
व्यवहार में क्या प्रयोग किया जाता है?
इन दिनों शायद ही कोई अपने खुद के छांटने वाले एल्गोरिदम को अब प्रोग्राम करता है; वे एक पुस्तकालय द्वारा प्रदत्त एक का उपयोग करते हैं। उदाहरण के लिए, जावा 7 एपीआई वास्तव में डुअल-पिवट क्विकर का उपयोग करता है।
जो लोग वास्तव में किसी कारण के लिए अपने स्वयं के सॉर्टिंग एल्गोरिदम को प्रोग्राम करते हैं, वे सरल 2-वे वेरिएंट से चिपके रहेंगे, क्योंकि त्रुटियों की कम संभावना ज्यादातर समय 20% बेहतर प्रदर्शन करती है। याद रखें: अब तक सबसे महत्वपूर्ण प्रदर्शन सुधार है जब कोड "काम नहीं कर रहा" से "काम करने" तक जाता है।