2009-04-10 30 views
28

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

+1

आप इस तरह के एक हार्ड ड्राइव के रूप में एक अपेक्षाकृत धीमी बाहरी स्रोत से डेटा की एक बड़ी राशि में लोड कर रहे हैं, तो यह का उपयोग करने के एक प्रकार के रूप में यू-गो एल्गोरिथ्म का उपयोग करने के लिए अक्सर बेहतर है एक सीपीयू में शामिल बर्बाद चक्र ड्राइव को पकड़ने की प्रतीक्षा कर रहे हैं। [नीचे मेरा जवाब देखें] (http://stackoverflow.com/a/30193315/4229245)। –

उत्तर

43

http://www.sorting-algorithms.com/insertion-sort से:

हालांकि यह O (n) बुरी से बुरी हालत समय, साथ प्राथमिक सॉर्टिंग एल्गोरिदम में से एक है प्रविष्टि प्रकार पसंद के एल्गोरिथ्म है या तो डेटा मौजूद हो लगभग क्रमबद्ध (क्योंकि यह अनुकूली है) या जब समस्या का आकार छोटा है (क्योंकि इसमें ओवरहेड कम है)।

इन कारणों के लिए

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

+3

आह, मैं स्थिरता के बारे में भूल गया ... मैंने वर्णित अन्य एल्गोरिदम में से कोई भी स्थिर नहीं है। –

+4

+1। सम्मिलन प्रकार का आंतरिक पाश आधुनिक सीपीयू और कैश के लिए एक अच्छा फिट होने लगता है - यह एक बहुत तंग लूप है जो केवल बढ़ते क्रम में स्मृति का उपयोग करता है। –

+0

खैर, क्विकॉर्ट को एक स्थिर प्रकार के रूप में कार्यान्वित किया जा सकता है, लेकिन चूंकि यह यादृच्छिक सेट के लिए इष्टतम है, मुझे लगता है कि कुशल qsort फ़ंक्शन सॉर्ट करने से पहले जानबूझकर डेटा को यादृच्छिक रूप से याद करते हैं। – guns

4

अधिकतर सॉर्टिंग प्रक्रियाएं बहुत छोटे डेटा सेट के लिए क्विकॉर्ट और फिर सम्मिलन प्रकार का उपयोग करेंगी।

13

एल्गोरिदम के विश्लेषण में एक महत्वपूर्ण अवधारणा asymptotic विश्लेषण है। विभिन्न एसिगिप्टिक चलने वाले समय के साथ दो एल्गोरिदम के मामले में, जैसे कि एक ओ (एन^2) और एक ओ (nlogn) क्रमशः सम्मिलन क्रम और क्विकॉर्ट के मामले में है, यह निश्चित नहीं है कि एक दूसरे की तुलना में तेज़ है ।

इस प्रकार के विश्लेषण के साथ महत्वपूर्ण भेद यह है कि पर्याप्त रूप से बड़े N के लिए, एक एल्गोरिदम दूसरे की तुलना में तेज़ होगा। ओ (nlogn) जैसे किसी शब्द को एल्गोरिदम का विश्लेषण करते समय, आप स्थिरांक छोड़ देते हैं। जब वास्तविक रूप से एल्गोरिदम के चलने का विश्लेषण करते हैं, तो उन स्थिरांक केवल छोटे एन की स्थितियों के लिए महत्वपूर्ण होंगे।

तो इसका क्या अर्थ है? इसका मतलब है कि कुछ छोटे एन के लिए, कुछ एल्गोरिदम तेजी से होते हैं। एंबेडेडगुरस.net से यह article सीमित स्थान (16k) और सीमित मेमोरी सिस्टम के मामले में विभिन्न सॉर्टिंग एल्गोरिदम चुनने पर एक दिलचस्प परिप्रेक्ष्य शामिल है। बेशक, आलेख संदर्भ केवल 20 पूर्णांक की एक सूची को क्रमबद्ध करता है, इसलिए एन के बड़े आदेश अप्रासंगिक हैं। छोटे कोड और कम स्मृति खपत (साथ ही साथ रिकर्सन से परहेज) अंततः अधिक महत्वपूर्ण निर्णय थे।

सम्मिलन प्रकार कम ओवरहेड है, इसे काफी संक्षेप में लिखा जा सकता है, और इसमें कई दो प्रमुख लाभ हैं: यह स्थिर है, और जब इनपुट लगभग सॉर्ट किया जाता है तो इसका तेजी से चलने वाला मामला होता है।

1

यदि आप एक क्रमबद्ध सूची बनाए रखने के बारे में बात कर रहे हैं, तो किसी प्रकार के पेड़ पर कोई फायदा नहीं होता है, यह धीमा है।

अच्छा, शायद यह कम स्मृति का उपभोग करता है या एक सरल कार्यान्वयन है।

एक हल कर सूची में सम्मिलित करना एक स्कैन, जिसका अर्थ है कि प्रत्येक डालने हे (एन) है शामिल होगी, इसलिए n आइटम छँटाई O (n^2)

एक कंटेनर में सम्मिलित करना इस तरह के एक संतुलित पेड़ के रूप में हो जाता है, आम तौर पर लॉग (एन) है, इसलिए क्रम ओ (एन लॉग (एन)) है जो निश्चित रूप से बेहतर है।

लेकिन छोटी सूचियों के लिए यह शायद ही कोई फर्क पड़ता है। यदि आप किसी भी पुस्तकालय के बिना इसे स्वयं लिखना चाहते हैं, तो आप एक सम्मिलित सॉर्ट का उपयोग कर सकते हैं, सूचियां छोटी हैं और/या आपको प्रदर्शन की परवाह नहीं है।

1

हाँ,

निवेशन तरह से कम सूचियों पर त्वरित क्रमबद्ध बेहतर है।

वास्तव में एक इष्टतम त्वरित सॉर्ट में आकार सीमा होती है जो यह बंद हो जाती है, और फिर संपूर्ण सरणी को थ्रेसहोल्ड सीमाओं पर सम्मिलन प्रकार द्वारा क्रमबद्ध किया जाता है।

भी ...

एक स्कोरबोर्ड को बनाए रखने के लिए, बाइनरी निवेशन क्रमबद्ध रूप में यह हो जाता है के रूप में अच्छा हो सकता है।

this page देखें।

+0

"स्कोरबोर्ड" धारणा, जहां वस्तुओं को एक समय में उपलब्ध कराया जाता है, मुझे उस स्थिति के "दोहरी" की याद दिलाता है, जहां वस्तुओं को एक समय में एक तरह से वापस करने की आवश्यकता होती है (चयन प्रकार के साथ)। मैंने एक एनएलजीएन सॉर्ट किया है जो पहले तत्व को पहले देता है, दूसरा तत्व दूसरा, आदि। बुककीपिंग ओवरहेड बहुत डरावना है, लेकिन तुलना की संख्या पुस्तकालय qsort() से छोटी है जिसके खिलाफ मैंने इसे बेंचमार्क किया है। एक के स्कोर के साथ प्राथमिक पूल में सभी नोड्स के साथ शुरू करें। प्राथमिक पूल से सबसे कम स्कोर के साथ दो आइटम दोहराएं और उन्हें तुलना करें ... – supercat

+0

... प्राथमिक स्कोर में "विजेता" को वापस रखकर, हारने वाले के स्कोर को अपने आप में जोड़ा गया, और "रिजर्व" में हारने वाला अपने स्कोर के साथ पूल unmodified। प्राथमिक पूल में एक तत्व होने तक जारी रखें। वह तत्व सबसे अच्छा है, इसलिए इसे आउटपुट करें, और उन सभी तत्वों को प्राथमिक पूल में ले जाएं जिनके खिलाफ विजेता तत्व की तुलना की गई थी। फिर प्राथमिक पूल से वस्तुओं को पहले तक ले जाना शुरू करें जब तक कि केवल एक ही बाएं (दूसरी सबसे अच्छी वस्तु) न हो। किसी भी समय, आरक्षित पूल में प्रत्येक आइटम प्राथमिक पूल में कम से कम एक आइटम से कम होगा, और प्राथमिक पूल में कोई आइटम नहीं ... – supercat

+0

... पूल में किसी और चीज़ से कम होना चाहिए । हालांकि प्राथमिक पूल इसमें सभी एन वस्तुओं के साथ शुरू होगा, बाद में पास केवल उन वस्तुओं को शामिल करता है जिनके खिलाफ "विजेता" की तुलना की गई थी, इसलिए पहले के बाद वस्तुओं को आउटपुट करना उचित रूप से तेज़ होगा। – supercat

8

हां, एक प्रविष्टि प्रकार या इसके रूपों में से एक का उपयोग करने का एक कारण है।

अन्य उत्तरों के सॉर्टिंग विकल्प (त्वरित क्रम, आदि) इस धारणा को मानते हैं कि डेटा पहले से ही स्मृति में है और जाने के लिए तैयार है।

लेकिन यदि आप धीमे बाहरी स्रोत (हार्ड ड्राइव कहें) से बड़ी मात्रा में डेटा में पढ़ने का प्रयास कर रहे हैं, तो वहां बड़ी मात्रा में बर्बाद हो गया है क्योंकि बाधा स्पष्ट रूप से डेटा चैनल या ड्राइव है। यह सिर्फ सीपीयू के साथ नहीं रह सकता है। किसी भी पढ़ने के दौरान इंतजार की एक प्राकृतिक श्रृंखला होती है। ये प्रतीक्षा करता है बर्बाद CPU चक्र जब तक आप उन्हें तरह करने के लिए उपयोग के रूप में तुम जाओ हैं।

उदाहरण के लिए, यदि आप बनाने के लिए थे, वे इस के लिए अपने समाधान हो निम्नलिखित:

  1. स्मृति में एक समर्पित पाश में डेटा की एक टन पढ़ें
  2. क्रमबद्ध कि डेटा

आप यदि आपने दो धागे में निम्नलिखित किया है तो उससे अधिक समय लगेगा।

थ्रेड एक:

  1. एक गृहीत फीफो कतार में
  2. प्लेस गृहीत पढ़ें
  3. (दोहराएँ जब तक ड्राइव से थक डेटा)

थ्रेड बी:

  1. फीफो कतार
  2. से एक डाटाम प्राप्त करें
  3. अपने अनुसार क्रमबद्ध सूची में उचित जगह में डालने
  4. (कतार खाली जब तक दोहराने और धागा ए का कहना है "हो गया")।

... उपर्युक्त आपको अन्यथा बर्बाद समय का उपयोग करने की अनुमति देगा। नोट: थ्रेड बी थ्रेड ए की प्रगति में बाधा नहीं डालता है।

जब तक डेटा पूरी तरह से पढ़ा जाता है, तो इसे क्रमबद्ध और उपयोग के लिए तैयार किया जाएगा।

0

एल्गोरिदम के विश्लेषण में एक महत्वपूर्ण अवधारणा एसिम्प्टोटिक विश्लेषण है। विभिन्न एसिगिप्टिक चलने वाले समयों के साथ दो एल्गोरिदम के मामले में, जैसे कि एक ओ (एन^2) और एक ओ (nlogn) क्रमशः सम्मिलन क्रम और क्विकॉर्ट के मामले में होता है, यह निश्चित नहीं है कि एक दूसरे की तुलना में तेज़ है।

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

तो इसका क्या अर्थ है? इसका मतलब है कि कुछ छोटे एन के लिए, कुछ एल्गोरिदम तेजी से होते हैं। एंबेडेडगुरस.net से इस आलेख में सीमित स्थान (16k) और सीमित मेमोरी सिस्टम के मामले में विभिन्न सॉर्टिंग एल्गोरिदम चुनने पर एक दिलचस्प परिप्रेक्ष्य शामिल है। बेशक, आलेख संदर्भ केवल 20 पूर्णांक की एक सूची को क्रमबद्ध करता है, इसलिए एन के बड़े आदेश अप्रासंगिक हैं। छोटे कोड और कम स्मृति खपत (साथ ही साथ रिकर्सन से परहेज) अंततः अधिक महत्वपूर्ण निर्णय थे।

सम्मिलन प्रकार कम ओवरहेड है, इसे काफी संक्षेप में लिखा जा सकता है, और इसमें कई दो प्रमुख लाभ हैं: यह स्थिर है, और जब इनपुट लगभग सॉर्ट किया जाता है तो इसका तेजी से चलने वाला मामला होता है।

0

छोटे सरणी सम्मिलन क्रम के लिए quicksort से तेज़ प्रदर्शन करता है। जावा 7 और जावा 8 आदिम डेटा प्रकारों को क्रमबद्ध करने के लिए दोहरी पिवट क्विकॉर्ट का उपयोग करता है। दोहरी पिवट Quicksort बाहर ठेठ एकल पिवट Quicksort प्रदर्शन करता है। दोहरे धुरी quicksort के एल्गोरिथ्म के अनुसार:

  1. छोटे सरणियों के लिए (लंबाई < 27), निवेशन तरह एल्गोरिथ्म का उपयोग करें।
  2. दो धुरी चुनें ...........

Definetely तरह बाहर सम्मिलन छोटे सरणियों के लिए quicksort करता है और यही वजह है कि आप लंबाई की सरणियों के लिए प्रविष्टि प्रकार के स्विच कर रहे हैं कम से कम 27। कारण सम्मिलन क्रम में कोई रिकर्स नहीं हो सकता है।

स्रोत: http://codeblab.com/wp-content/uploads/2009/09/DualPivotQuicksort.pdf

संबंधित मुद्दे

 संबंधित मुद्दे