अभ्यास में अन्य सॉर्टिंग एल्गोरिदम की तुलना में क्विकसॉर्ट बेहतर क्यों है?


31

यह Janoma द्वारा cs.SE पर एक प्रश्न का एक रिपॉस्ट है । पूर्ण क्रेडिट और उसे बिगाड़ता है या सीएसईई।

एक मानक एल्गोरिदम पाठ्यक्रम में हमें सिखाया जाता है कि क्विकॉर्ट्स औसत पर ओ (एन लॉग एन) और सबसे खराब स्थिति में ओ (एन) है। उसी समय, अन्य सॉर्टिंग एल्गोरिदम का अध्ययन किया जाता है जो ओ (एन लॉग एन) सबसे खराब स्थिति (जैसे मर्जसॉर्ट और हेस्पोर्ट ) में होते हैं, और सबसे अच्छा मामले में भी रैखिक समय (जैसे बुलबुले ) लेकिन स्मृति की कुछ अतिरिक्त जरूरतों के साथ।

कुछ और अधिक चलने वाले समय में त्वरित नज़र के बाद यह कहना स्वाभाविक है कि क्विकॉर्ट दूसरों की तरह कुशल नहीं होना चाहिए

इसके अलावा, विचार करें कि छात्र बुनियादी प्रोग्रामिंग पाठ्यक्रमों में सीखते हैं कि पुनरावृत्ति वास्तव में सामान्य नहीं है क्योंकि यह बहुत अधिक मेमोरी का उपयोग कर सकता है, आदि इसलिए (और भले ही यह एक वास्तविक तर्क नहीं है), इससे यह विचार मिलता है कि क्विकॉर्ट्स नहीं हो सकता है वास्तव में अच्छा है क्योंकि यह एक पुनरावर्ती एल्गोरिथ्म है।

फिर, क्विकसर्ट अन्य सॉर्टिंग एल्गोरिदम को अभ्यास में क्यों बेहतर बनाता है? क्या इसका वास्तविक दुनिया के आंकड़ों की संरचना से कोई लेना -देना है ? क्या इसका कंप्यूटर में मेमोरी के काम करने के तरीके से लेना-देना है? मुझे पता है कि कुछ यादें दूसरों की तुलना में तेज़ हैं, लेकिन मुझे नहीं पता कि इस काउंटर-सहज प्रदर्शन का असली कारण (सैद्धांतिक अनुमानों की तुलना में) है।


3
Quicksort प्रतिष्ठा ऐसे समय से आती है जब कैश मौजूद नहीं था।
एपीग्रामग्राम

9
"क्यों अनुरक्षण अभ्यास में अन्य छँटाई एल्गोरिदम बेहतर प्रदर्शन करता है?" यकीन है कि यह सच है? इस कथन के साथ आप जिस वास्तविक कार्यान्वयन का संदर्भ दे रहे हैं, उसे हमें दिखाएं, और समुदाय आपको बताएगा कि विशिष्ट कार्यान्वयन ऐसा करने के तरीके का व्यवहार क्यों करता है। बाकी सब कुछ गैर-मौजूद कार्यक्रमों के बारे में जंगली अनुमान लगाएगा।
डॉक ब्राउन

1
@ डॉकब्रोर्न: कई क्विकॉर्ट (या इसके वेरिएंट) कार्यान्वयन कई पुस्तकालयों में चुने जाते हैं, यकीनन क्योंकि वे सबसे अच्छा प्रदर्शन करते हैं (मुझे आशा है कि ऐसा है)। तो बस एल्गोरिदम के बारे में कुछ हो सकता है जो क्विकॉर्ट को तेज बनाता है, स्वतंत्र रूप से कार्यान्वयन के लिए
राफेल

1
किसी को पूर्णता के लिए यह कहना है, इसलिए मैं कहूंगा: क्विकसॉर्ट (आमतौर पर) स्थिर नहीं है। इस कारण से, आप इसका उपयोग नहीं करना चाह सकते हैं। इसके अलावा, इस कारण से, आपका डिफ़ॉल्ट क्रम एक क्विकॉर्ट भी नहीं हो सकता है जब भी आप चाहते हैं।
राल्फचैपिन

1
@ रैपेल: अक्सर जिसे क्विक सॉर्ट कहा जाता है, वह वास्तव में इंट्रो सॉर्ट (प्रयुक्त, एफएआईसी, सी ++ मानक लाइब्रेरी में) की तरह कुछ भिन्नता है, न कि शुद्ध त्वरित सॉर्ट।
जियोर्जियो

जवाबों:


21

मैं इस बात से सहमत नहीं होगा कि अभ्यास में अन्य सॉर्टिंग एल्गोरिदम की तुलना में क्विकसॉर्ट बेहतर है।

अधिकांश उद्देश्यों के लिए, Timsort - मर्जर्ट / इंसर्शन सॉर्ट के बीच का हाइब्रिड जो इस तथ्य का शोषण करता है कि आपके द्वारा सॉर्ट किया गया डेटा अक्सर लगभग सॉर्ट किया गया या रिवर्स सॉर्ट किया जाता है।

सरलतम एस्कॉर्ट (कोई रैंडम पिवट) इस संभावित सामान्य मामले को O (N ^ 2) (O (N lg N) को यादृच्छिक pivots के साथ) के रूप में मानता है, जबकि TimSort इन मामलों को O (N) में संभाल सकता है।

C # में इन बेंचमार्क के अनुसार बिल्ट-इन क्विकॉर्ट को टिमर्ट से तुलना करना, ज्यादातर सॉर्ट किए गए मामलों में टिम्सॉर्ट काफी तेज है, और रैंडम डेटा के मामले में थोड़ा तेज है और टिमसॉर्ट बेहतर हो जाता है अगर तुलना समारोह विशेष रूप से धीमा हो। मैंने इन बेंचमार्क को दोहराया नहीं है और अगर रैंडम डेटा के कुछ संयोजन के लिए क्विकॉर्ट ने थोड़ी सी भी टिमर्ट को हरा दिया है या आश्चर्य नहीं होगा, अगर सी # बिल्डिन सॉर्ट (क्विकॉर्ट के आधार पर) में कुछ विचित्र है जो इसे धीमा कर रहा है। हालाँकि, डेटा के आंशिक रूप से सॉर्ट किए जाने पर टिमसॉर्ट के अलग-अलग फायदे हैं, और जब डेटा आंशिक रूप से सॉर्ट नहीं किया जाता है तो गति के मामले में क्विकॉर्ट के बराबर होता है।

टिमसर्ट में क्विकॉर्ट के विपरीत एक स्थिर सॉर्ट होने का एक अतिरिक्त बोनस भी है। TimSort का एकमात्र नुकसान सामान्य (तेज़) कार्यान्वयन में O (N) बनाम O (lg N) मेमोरी का उपयोग करता है।


18

त्वरित प्रकार को जल्दी माना जाता है क्योंकि गुणांक छोटा होता है जो किसी अन्य ज्ञात एल्गोरिथ्म में होता है। इसका कोई कारण या प्रमाण नहीं है, बस एक छोटे गुणांक के साथ कोई एल्गोरिथ्म नहीं मिला है। यह सच है कि अन्य एल्गोरिदम में भी ओ ( एन लॉग एन ) समय है, लेकिन वास्तविक दुनिया में गुणांक भी महत्वपूर्ण है।

ध्यान दें कि छोटे डेटा प्रविष्टि सॉर्ट के लिए (जिसे ओ ( एन 2 ) माना जाता है ) गणितीय कार्यों की प्रकृति के कारण तेज है। यह विशिष्ट गुणांक पर निर्भर करता है जो मशीन से मशीन में भिन्न होता है। (अंत में, केवल असेंबली वास्तव में चल रही है।) इसलिए कभी-कभी त्वरित सॉर्ट और सम्मिलन सॉर्ट का एक हाइब्रिड अभ्यास मुझे लगता है कि सबसे तेज है।


7
+ सही है। शिक्षकों को इस तथ्य के बारे में अधिक जागरूक होना चाहिए (और मैं एक शिक्षक था) कि परिमाण के आदेशों के अनुसार निरंतर कारक भिन्न हो सकते हैं। तो बड़े-ओ की परवाह किए बिना प्रदर्शन ट्यूनिंग का कौशल वास्तव में मायने रखता है। समस्या यह है कि वे अध्यापन को गंभीरता से लेते रहते हैं , केवल इसलिए कि उन्हें उस बुलेट पॉइंट को पाठ्यक्रम में लाना पड़ता है, जो कि 180 डिग्री गलत दृष्टिकोण है।
माइक डनलैवी

2
"इसके लिए कोई कारण या समर्थक [ओ] एफ नहीं है": सुनिश्चित करें कि वहाँ है। यदि आप गहरी खुदाई करते हैं, तो आपको एक कारण मिलेगा।
गिल्स एसओ-

2
@ बी सेवन: एक ओ (एन लॉग एन) सॉर्ट एल्गोरिथ्म के लिए बहुत ... को सरल बनाने के लिए, एन आइटम सॉर्ट करने के लिए सॉर्टिंग लूप की पुनरावृत्तियां (एन लॉग एन) हैं। गुणांक लूप के प्रत्येक चक्र को कितना समय लगता है। जब n वास्तव में बड़ा होता है (कम से कम हजारों), तो गुणांक O () के रूप में ज्यादा मायने नहीं रखता है, भले ही गुणांक विशाल हो। लेकिन जब n छोटा होता है, तो गुणांक मायने रखता है - और सबसे महत्वपूर्ण बात हो सकती है यदि आप केवल 10 वस्तुओं को छांट रहे हैं।
मैट गैलाघर

4
@ मायिक डनलैवी - एक अच्छा उदाहरण यह है कि पिरामिडों का निर्माण O (n) है जबकि उनकी तस्वीरों को छांटना O (n ln n) है, लेकिन जो जल्दी है!
मार्टिन बेकेट

2
हे (एन लॉग एन) एल्गोरिदम जैसे कि हेप्सॉर्ट और मर्जसेर्ट की गारंटी है, इसलिए एसिम्प्टोटिक सबसे खराब स्थिति में क्विकॉर्ट भी उतना ही तेज नहीं है जितना कि सबसे अच्छा। लेकिन वास्तविक दुनिया के प्रदर्शन में, कुछ क्विकॉर्ट वेरिएंट बहुत अच्छा करते हैं। हालांकि "गुणांक छोटा है" कहना यह कहने जैसा है कि "यह तेज़ है क्योंकि यह तेज़ है"। लगातार कारक इतने छोटे क्यों हैं? एक प्रमुख कारण यह है कि इलाके में क्विकॉर्ट बहुत अच्छा है - यह कैश का बहुत अच्छा उपयोग करता है। मर्जेसॉर्ट में अच्छी स्थानीयता भी है, लेकिन इन-प्लेस करना बहुत कठिन है।
स्टीव

16

क्विकसॉर्ट अन्य सभी सॉर्टिंग एल्गोरिदम से बेहतर प्रदर्शन नहीं करता है। उदाहरण के लिए, बॉटम-अप हीप सॉर्ट ( वेगेनर 2002 ) उचित मात्रा में डेटा के लिए एस्परटॉर्फ़ को बेहतर बनाता है और यह एक इन-प्लेस एल्गोरिथ्म भी है। इसे लागू करना भी आसान है (कम से कम, कुछ अनुकूलित क्विकॉर्ट वेरिएंट की तुलना में कठिन नहीं)।

यह सिर्फ इतनी अच्छी तरह से ज्ञात नहीं है और आप इसे कई पाठ्य पुस्तकों में नहीं पाते हैं, जो यह समझा सकते हैं कि यह क्विकॉर्ट के रूप में लोकप्रिय क्यों नहीं है।


+1: मैंने कुछ परीक्षण किए हैं और वास्तव में मर्ज सॉर्ट निश्चित रूप से बड़े सरणियों (> 100000 तत्वों) के लिए त्वरित सॉर्ट की तुलना में बेहतर था। हीप सॉर्ट मर्ज सॉर्ट की तुलना में थोड़ा खराब था (लेकिन मर्ज सॉर्ट को अधिक मेमोरी की आवश्यकता होती है)। मुझे लगता है कि लोग जिसे त्वरित सॉर्ट कहते हैं, वह अक्सर इंट्रो सॉर्ट नामक एक भिन्नता है: त्वरित सॉर्ट जो पुनरावृत्ति की गहराई को एक निश्चित सीमा से परे होने पर वापस छाँटने के लिए गिरता है।
जियोर्जियो

@ जियोर्जियो: इसे सुधारने के लिए कुछ तरीकों से क्विकॉर्ट को संशोधित किया जा सकता है, उदाहरण के लिए यहां देखें: algs4.cs.princeton.edu/23quicksort क्या आपने उस सुधार की कोशिश की?
डॉक्टर ब्राउन

दिलचस्प है, क्या आप इसके बारे में अधिक पढ़ने के लिए किसी किताब \ साइट का संदर्भ दे सकते हैं? (अधिमानतः एक पुस्तक)
रामजी कहिल

@Martin: आप नीचे के बारे में ढेर अप का मतलब है? खैर, मैंने ऊपर एक संदर्भ दिया। यदि आप एक निशुल्क संसाधन चाहते हैं, तो जर्मन विकिपीडिया के पास इसके बारे में एक लेख है ( de.wikipedia.org/wiki/BottomUp-Heapsort )। यहां तक ​​कि अगर आप जर्मन नहीं बोलते हैं, तो मुझे लगता है कि आप अभी भी C99 उदाहरण पढ़ सकते हैं।
डॉक ब्राउन

7

आपको केवल सबसे खराब स्थिति पर और केवल समय जटिलता पर केंद्र नहीं होना चाहिए। यह सबसे खराब औसत से अधिक है, और यह समय और स्थान के बारे में है।

जल्दी से सुलझाएं:

  • Θ ( एन लॉग एन ) की एक औसत समय जटिलता है ;
  • ) (लॉग एन ) के अंतरिक्ष जटिलता के साथ लागू किया जा सकता है ;

खाते में यह भी है कि बड़ा नोटेशन किसी भी स्थिरांक को ध्यान में नहीं रखता है, लेकिन व्यवहार में यह फर्क पड़ता है अगर एल्गोरिथ्म कुछ गुना तेज है। ) ( N log n ) का अर्थ है, कि एल्गोरिथ्म K  n  लॉग ( n ) में निष्पादित होता है , जहां K स्थिर है। Quicksort सबसे कम K के साथ तुलना-प्रकार एल्गोरिथ्म है ।


1
@ गिल्स: यह कम के है, क्योंकि यह एक साधारण एल्गोरिथ्म है।
वार्टेक

5
WTF? इसका कोई मतलब नहीं है। एक एल्गोरिथ्म की सादगी का इसके चलने की गति से कोई संबंध नहीं है। चयन सॉर्ट क्विकर की तुलना में सरल है, जो इसे तेज नहीं बनाता है।
गिल्स एसओ- बुराई को रोकें '30

1
@ गिल्स: किसी भी मामले (सबसे खराब, औसत और सर्वश्रेष्ठ) के लिए चयन सॉर्ट O (n ^ 2) है। तो यह कोई फर्क नहीं पड़ता कि यह कितना सरल है। क्विकॉर्टोर्ट औसत केस के लिए O (n log n) है, और O (n log n) के साथ सभी एल्गो के बीच यह सबसे सरल है।
वार्तेक

1
@ गिल्स: अन्य चीजें समान होने के कारण, सरलता प्रदर्शन में सहायता करती है। कहते हैं कि आप दो एल्गोरिदम की तुलना कर रहे हैं, जो प्रत्येक (के एन एन एन एन) उनके संबंधित आंतरिक छोरों की पुनरावृत्तियों: एल्गोरिथ्म को प्रति लूप कम सामान करने की आवश्यकता होती है।
दोपहर

1
@ आने वाले समय: इस तरह फुसफुसाए कि आपका बयान एक तनातनी है, लेकिन यह "सादगी" से संबंधित नहीं है। उदाहरण के लिए, क्विकसॉर्ट (मामले के भेद!) के अधिक जटिल रूप हैं, जिसके परिणामस्वरूप छोटे रनटाइम (सिद्धांत और व्यवहार दोनों में) हैं।
राफेल

5

क्विकॉर्ट अक्सर एक अच्छा विकल्प होता है क्योंकि यह बहुत तेजी से और यथोचित त्वरित और लागू करने में आसान होता है।

यदि आप बड़ी मात्रा में डेटा को बहुत जल्दी छांटने के बारे में गंभीर हैं तो संभवत: आप मर्जसॉर्ट पर कुछ बदलाव के साथ बेहतर हैं। यह बाहरी भंडारण का लाभ उठाने के लिए बनाया जा सकता है, कई थ्रेड्स या यहां तक ​​कि प्रक्रियाओं का उपयोग कर सकता है लेकिन वे कोड के लिए तुच्छ नहीं हैं।


1

एल्गोरिदम का वास्तविक प्रदर्शन मंच पर निर्भर करता है, साथ ही साथ भाषा, संकलक, कार्यान्वयन विस्तार, विशिष्ट अनुकूलन प्रयास, एट वगैरह के लिए प्रोग्रामर का ध्यान। तो, क्विकसॉर्ट का "निरंतर कारक लाभ" बहुत अच्छी तरह से परिभाषित नहीं है - यह वर्तमान में उपलब्ध उपकरणों के आधार पर एक व्यक्तिपरक निर्णय है, और जो भी तुलनात्मक प्रदर्शन अध्ययन करता है, उसके द्वारा "समतुल्य कार्यान्वयन प्रयास" का एक मोटा अनुमान है। ।

मैंने कहा, मेरा मानना ​​है कि क्विकसॉर्ट अच्छा प्रदर्शन करता है (यादृच्छिक इनपुट के लिए) क्योंकि यह सरल है, और क्योंकि इसकी पुनरावर्ती संरचना अपेक्षाकृत कैश-अनुकूल है। दूसरी ओर, क्योंकि इसका सबसे खराब मामला ट्रिगर करना आसान है, क्विकॉर्ट के किसी भी व्यावहारिक उपयोग को इसके पाठ्यपुस्तक विवरण से अधिक जटिल होने की आवश्यकता होगी जो इंगित करेगा: इस प्रकार, संशोधित संस्करण जैसे कि इंट्रोसर्ट।

समय के साथ, जैसा कि प्रमुख प्लेटफ़ॉर्म में परिवर्तन होता है, विभिन्न एल्गोरिदम लाभ (या परिभाषित) रिश्तेदार लाभ प्राप्त कर सकते हैं या खो सकते हैं। सापेक्षिक प्रदर्शन पर पारंपरिक ज्ञान इस बदलाव से पीछे रह सकता है, इसलिए यदि आप वास्तव में अनिश्चित हैं कि आपके एप्लिकेशन के लिए कौन सा एल्गोरिथ्म सबसे अच्छा है, तो आपको दोनों को लागू करना चाहिए, और उनका परीक्षण करना चाहिए।


मुझे लगता है कि "छोटे निरंतर" अन्य लोग इसे संबंधित हैं औपचारिक विश्लेषण में एक है, जो तुलना या स्वैप की संख्या पर है। यह बहुत अच्छी तरह से परिभाषित किया गया है, लेकिन यह स्पष्ट नहीं है कि यह रनटाइम में कैसे अनुवाद करता है। एक सहयोगी वर्तमान में उस पर कुछ शोध करता है, वास्तव में।
राफेल

मेरी धारणा यह थी कि यह सामान्यीकृत प्रदर्शन के बारे में था, लेकिन मैं या तो नहीं गिनूंगा। आप सही हैं, हालांकि: यदि आपकी तुलना विशेष रूप से महंगी है, तो आप अपेक्षित तुलनाओं की संख्या देख सकते हैं ...
17

1
आपके द्वारा बताए गए कारण के लिए, समग्र प्रदर्शन (समय-वार) के बारे में बात करना सामान्य मामले में बहुत अधिक विवरण कारक के रूप में सार्थक नहीं है। केवल चुनिंदा कार्यों को गिनने का कारण यह नहीं है कि वे महंगे हैं, लेकिन वे अक्सर "सबसे अधिक" होते हैं। "लैंडौ-नोटेशन (बिग-ओह) अर्थ में, इसलिए उन लोगों को गिनना जो आपको अपने विषम स्पर्श देता है। जैसे ही आप स्थिरांक और / या रनटाइम पर विचार करते हैं, यह रणनीति बहुत कम दिलचस्प है।
राफेल

क्विकॉर्ट का एक अच्छा कार्यान्वयन इस तरह संकलित करेगा कि आपके धुरी मूल्य सीपीयू रजिस्टर में तब तक बने रहेंगे जब तक वे आवश्यक हैं। यह अक्सर तुलनीय बिग-ओ समय के साथ सैद्धांतिक रूप से तेजी से हरा करने के लिए पर्याप्त है।
दान ल्योन

विभिन्न प्रकार के एल्गोरिदम में तुलनाओं की संख्या और उनके द्वारा किए जाने वाले इंटरचेंज की संख्या के संबंध में अलग-अलग विशेषताएं हैं। और @DanLyons ध्यान दें कि एक पुस्तकालय में एक विशिष्ट प्रकार उपयोगकर्ता-आपूर्ति किए गए कार्यों के माध्यम से अपनी तुलना करता है, और बहुत सारे फ़ंक्शन कॉल में रजिस्टरों में मूल्यों को बनाए रखना बहुत मुश्किल है।
पॉइन्टी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.