quicksort बुरी से बुरी हालत (एन) हे के प्रदर्शन है, लेकिन अभी भी वैसे भी व्यवहार में व्यापक रूप से इस्तेमाल किया जाता है। ऐसा क्यों है?अभ्यास में क्विकॉर्ट का उपयोग क्यों किया जाता है?
उत्तर
औसत पर यह सबसे तेज़ तुलना क्रम है (बीत चुके समय के मामले में)।
क्योंकि, सामान्य मामले में, यह सबसे तेज़ सॉर्टिंग एल्गोरिदम में से एक है।
quicksort की औसत asymptotic क्रम O(nlogn)
है और यह छोटे स्थिरांक (तंग छोरों) की वजह से heapsort से आम तौर पर और अधिक कुशल है। वास्तव में, एक सैद्धांतिक रैखिक समय औसत चयन एल्गोरिदम है जिसे आप हमेशा सर्वोत्तम पिवट खोजने के लिए उपयोग कर सकते हैं, जिसके परिणामस्वरूप सबसे खराब स्थिति O(nlogn)
हो सकती है। हालांकि, सामान्य क्विकॉर्ट आमतौर पर इस सैद्धांतिक से तेज है।
इसे और अधिक समझदार बनाने के लिए, संभावना है कि quicksort O(n
2
)
में खत्म हो जाएगा पर विचार करें। यह सिर्फ 1/n!
है जिसका अर्थ है कि यह लगभग उस बुरे मामले का सामना नहीं करेगा।
आप केवल पर सबसे ज्यादा मामले और केवल समय जटिलता पर केंद्रित नहीं करना चाहिए। यह सबसे खराब से औसत के बारे में अधिक है, और यह लगभग और स्थान के बारे में है।
quicksort:
- Θ (n लॉग n) की औसत समय जटिलता है; (लॉग n)
- Θ की अंतरिक्ष जटिलता के साथ लागू किया जा सकता है;
यह भी ध्यान में रखते हैं कि बड़े ओ नोटेशन किसी भी स्थिरांक को ध्यान में नहीं रखता है, लेकिन व्यावहारिक रूप से यह एल्गोरिदम कुछ गुना तेजी से भिन्न होता है। Θ (n लॉग n) का अर्थ है, कि एल्गोरिथ्म में कश्मीर n लॉग (n), जहां कश्मीर स्थिर है निष्पादित करता है। क्विक्सोर्ट तुलनात्मक क्रमबद्ध एल्गोरिदम है जो सबसे कम के के साथ है।
यह इंगित करने लायक हो सकता है कि सी में लाइब्रेरी फ़ंक्शन qsort()
है, लेकिन कोई आवश्यकता नहीं है कि इसे वास्तविक क्विकॉर्ट का उपयोग करके लागू किया जाए, जो कि कंपाइलर विक्रेता पर निर्भर है।
हालांकि सबसे तेजी से होने के अलावा, इसके बारे में कुछ बुरा मामले परिदृश्यों यह छँटाई से पहले सरणी फेरबदल से बचा जा सकता है। चूंकि छोटे डेटा सेट के साथ इसकी कमजोरी के कारण, डेटासेट छोटे होने के कारण स्पष्ट रूप से बड़ी समस्या नहीं है और सॉर्ट टाइम शायद छोटे हैं।
उदाहरण के तौर पर, मैंने क्विकॉर्ट और बबल प्रकार के लिए एक पायथन फ़ंक्शन लिखा था। बबल प्रकार में 10,000 रिकॉर्ड, 7500 के लिए 11 सेकंड और 5000 के लिए 5 सेकंड करने के लिए ~ 20 सेकंड लगते हैं। क्विकॉर्ट लगभग 0.15 सेकेंड में इन सभी प्रकारों को करता है! quicksort बनाम mergesort के लिए एन एलजी n के लिए 1.44 n एलजी n (उम्मीद) -
कोई उचित प्रकार बुलबुले से बेहतर प्रदर्शन करने जा रहा है। इसे विलय, हेपॉर्ट या ब्लॉगरोर्ट की तुलना करने का प्रयास करें। इसके अलावा, यह quicksort में खिलाने से पहले लगभग एक क्रमबद्ध सूची फेरबदल एक अच्छा अवसर की बर्बादी की तरह लगता है। – saolof
दिलचस्प बात यह है quicksort अधिक mergesort की तुलना में औसतन तुलना करता है।यदि सभी परिपक्व तुलना की तुलना में थे, तो विलय त्वरित रूप से क्विकॉर्ट के लिए बेहतर होगा।
कारण यह है कि quicksort तेज है यह कई अन्य वांछनीय गुणों है कि आधुनिक हार्डवेयर पर बहुत अच्छी तरह से काम करते हैं होता है। उदाहरण के लिए, क्विकॉर्ट को गतिशील आवंटन की आवश्यकता नहीं होती है। रिकर्सन के लिए आवश्यक स्टैक फ्रेम को स्टोर करने के लिए यह केवल ओ (लॉग एन) स्टैक स्पेस (सबसे खराब केस अगर सही ढंग से कार्यान्वित किया जाता है) का उपयोग करके मूल सरणी पर जगह-जगह पर काम कर सकता है। यद्यपि विलय करने के लिए विलय किया जा सकता है, ऐसा करने पर आमतौर पर मर्ज चरण के दौरान एक विशाल प्रदर्शन दंड पर आता है। हेपसोर्ट जैसे अन्य सॉर्टिंग एल्गोरिदम भी इस संपत्ति में हैं।
साथ ही, quicksort संदर्भ के उत्कृष्ट इलाके है। विभाजन चरण, होवर के इन-प्लेस विभाजन एल्गोरिदम का उपयोग करके किया जाता है, अनिवार्य रूप से दो रैखिक स्कैन सरणी के दोनों सिरों से अंदरूनी प्रदर्शन किया जाता है। इसका मतलब है कि क्विकॉर्ट में कैश मिस की बहुत छोटी संख्या होगी, जो आधुनिक वास्तुकला पर प्रदर्शन के लिए महत्वपूर्ण है। दूसरी तरफ, हेपसोर्ट में बहुत अच्छा इलाका नहीं है (यह एक सरणी के चारों ओर कूदता है), हालांकि अधिकांश विलयों के कार्यान्वयन में उचित रूप से इलाके हैं।
quicksort भी बहुत में चलाने योग्य है। एक बार जब प्रारंभिक विभाजन चरण छोटे और बड़े क्षेत्रों में सरणी को विभाजित करने के लिए हुआ है, तो उन दो भागों को स्वतंत्र रूप से एक दूसरे से क्रमबद्ध किया जा सकता है। कई सॉर्टिंग एल्गोरिदम को विलय समेत समानांतर किया जा सकता है, लेकिन समानांतर क्विकॉर्ट का प्रदर्शन उपर्युक्त कारणों के लिए अन्य समांतर एल्गोरिदम से बेहतर होता है। दूसरी तरफ, हेपसोर्ट नहीं है।
क्विक्सॉर्ट के साथ एकमात्र मुद्दा यह संभावना है कि यह ओ (एन) में गिरावट आती है, जो बड़े डेटा सेट पर बहुत गंभीर हो सकती है। इससे बचने का एक तरीका यह है कि एल्गोरिदम स्वयं पर आत्मनिरीक्षण करें और उस मामले में धीमे लेकिन अधिक भरोसेमंद एल्गोरिदम पर स्विच करें जहां यह खराब हो। इस एल्गोरिथ्म, introsort कहा जाता है, एक महान संकर छँटाई एल्गोरिथ्म है कि रोग के मामले बिना quicksort के अनेक लाभ प्राप्त करता है।
सारांश में:
- quicksort ढेर प्रत्यावर्तन में इस्तेमाल किया फ्रेम, जो हे (लॉग एन) जगह लेने के लिए छोड़कर यथा-स्थान है।
- quicksort संदर्भ के अच्छे इलाके है।
- quicksort आसानी से parallelized है।
यह खाता है कि क्यों पेपर पर सॉर्टिंग एल्गोरिदम को बेहतर प्रदर्शन करना पड़ता है।
आशा है कि इससे मदद मिलती है!
Bcs यह अच्छी तरह से बड़े के साथ ओ (NlogN) जटिलता सेट डेटा पर काम के साथ एल्गोरिथ्म से एक है। यह जगह एल्गोरिदम भी है जो निरंतर स्थान लेता है। पिवोट तत्व को बुद्धिमानी से चुनकर हम त्वरित क्रम के खराब मामले से बच सकते हैं और हमेशा क्रमबद्ध सरणी पर ओ (एनएलओएनएन) में प्रदर्शन करेंगे।
- 1. .NET में प्रतिबिंब का उपयोग क्यों किया जाता है?
- 2. क्यों ओजीआई का उपयोग किया जाता है?
- 3. सुहोसिन का उपयोग क्यों किया जाता है?
- 4. क्या हेपसोर्ट कभी अभ्यास में प्रयोग किया जाता है?
- 5. क्यों रैंड में 1103515245 का उपयोग किया जाता है?
- 6. आईएसओ में NSUserDefaults का उपयोग क्यों किया जाता है?
- 7. स्ट्रिंगटोकनाइज़र का बहिष्कार क्यों किया जाता है?
- 8. क्लैंग का अधिक उपयोग क्यों नहीं किया जाता है?
- 9. क्यों Erlang चर का उपयोग नहीं किया जाता है?
- 10. टाइपिड कीवर्ड खराब डिज़ाइन का उपयोग क्यों किया जाता है?
- 11. कार्यों के बजाय कन्स्ट्रक्टर का उपयोग क्यों किया जाता है?
- 12. Backbone.js: _.bindAll() प्रारंभ में - इसका उपयोग क्यों किया जाता है?
- 13. MySQL क्यों वेब विकास में अक्सर उपयोग किया जाता है?
- 14. UITableViewCell पहचानकर्ताओं में स्थिर कीवर्ड क्यों उपयोग किया जाता है?
- 15. लेआउट का उपयोग कैसे किया जाता है?
- 16. स्ट्रिंगियो का उपयोग कब किया जाता है?
- 17. उपयोग करने से बेहतर क्यों उपयोग किया जाता है?
- 18. ImmutableObjectAttribute का उपयोग कैसे किया जाता है?
- 19. LiteralControl क्या है? इसका उपयोग क्यों किया जाता है?
- 20. @JsonProperty प्रॉपर्टी का उपयोग कब किया जाता है और इसके लिए क्या उपयोग किया जाता है?
- 21. एसक्यूएल सर्वर में कर्सर का उपयोग करने के लिए इसे बुरा अभ्यास क्यों माना जाता है?
- 22. आमतौर पर पाइथन विशेषता डॉकस्ट्रिंग का उपयोग किया जाता है?
- 23. आउटपुट बफरिंग का उपयोग खराब अभ्यास माना जाता है?
- 24. एक्शन.इनवोक का उपयोग कर सबसे अच्छा अभ्यास माना जाता है?
- 25. नॉकआउट जे में चेकबॉक्स क्यों चेक किया जाता है जब केवल चेक किया जाता है?
- 26. https केवल लॉगिन के लिए क्यों उपयोग किया जाता है?
- 27. io_service, इसका उपयोग क्यों और कैसे किया जाता है?
- 28. फॉक्सप्रो पीओएस सिस्टम के लिए क्यों उपयोग किया जाता है?
- 29. वैश्विक चर क्यों खराब अभ्यास माना जाता है?
- 30. वास्तव में XQUERY का उपयोग कैसे किया जाता है?
तथ्य क्यूएस विभाजन, इसका मतलब है कि अंत में विभाजन आकार यह कैश में पूरी तरह से फिट करने के लिए अनुमति देगा। यह तेजी से प्रसंस्करण के लिए बनाता है, खासकर जब बबल प्रकार की तरह सामानों की तुलना में, जो पूर्ण डेटा सेट पर बार-बार गुजरता है। मैं दावा करता हूं कि विभाजन प्रकार के प्रकार, छोटे काम करने वाले सेट, फिर अन्य प्रकार के साथ बेहतर प्रदर्शन करेंगे। – EvilTeach