Java और .NET: अलग-अलग सॉर्टिंग एल्गोरिदम का उपयोग डिफ़ॉल्ट रूप से क्यों किया जाता है?


19

बस सोच क्यों Javaऔर .NET Frameworkडिफ़ॉल्ट रूप से अलग छँटाई एल्गोरिथ्म का उपयोग करता है।

जावा में डिफ़ॉल्ट रूप से मर्ज सॉर्ट एल्गोरिथ्म Array.Sort()का उपयोग करता है और जैसा कि Wikipedia.com कहता है:

जावा में, Arrays.sort () विधियाँ डेटेट के आधार पर मर्ज सॉर्ट या ट्यून्ड एस्कॉर्ट का उपयोग करती हैं और कार्यान्वयन दक्षता स्विच के लिए जब सात से कम सरणी तत्वों को सॉर्ट किया जा रहा है

.NET फ्रेमवर्क में डिफ़ॉल्ट सॉर्टिंग एल्गोरिथ्म ( MSDN ) के रूप में क्विक सॉर्टArray.Sort/List.Sort() का उपयोग करता है :

List.Sort () Array.Sort का उपयोग करता है, जो QuickSort एल्गोरिथ्म का उपयोग करता है। यह कार्यान्वयन एक अस्थिर प्रकार करता है; अर्थात्, यदि दो तत्व समान हैं, तो उनके क्रम को संरक्षित नहीं किया जा सकता है। इसके विपरीत, एक स्थिर प्रकार उन तत्वों के क्रम को संरक्षित करता है जो समान हैं।

महान "एल्गोरिदम की तुलना" तालिका को देखकर हम देख सकते हैं कि दोनों एल्गोरिदम का वर्स्ट केस और मेमोरी यूसेज के दृष्टिकोण से बहुत अलग व्यवहार है:

यहाँ छवि विवरण दर्ज करें

दोनों Javaऔर .NETउद्यम समाधान के विकास के लिए महान फ़्रेमवर्क दोनों एम्बेडेड विकास के लिए प्लेटफॉर्म है कर रहे हैं। तो क्यों वे डिफ़ॉल्ट रूप से अलग-अलग छँटाई एल्गोरिथ्म का उपयोग कर रहे हैं, कोई विचार?


1
इन दो प्रकारों के बीच तुलना पर अधिक चर्चा के लिए, stackoverflow.com/q/680541/866022
yoozer8

जवाबों:


10

कंप्यूटर के रूप में निर्धारक के रूप में, कंप्यूटर इंजीनियरिंग एक सटीक विज्ञान नहीं है। एक ही समस्या डोमेन में दो लोग, एक विश्लेषण करेंगे और दो अलग-अलग समाधान विकसित करेंगे जो समस्या के सभी बाधाओं को पूरा करते हैं। यह अनुभव करना मुश्किल या असंभव हो सकता है कि सामान्य मामले में इनमें से कौन सा "बेहतर" है।

मेरा अनुमान है कि .NET क्विकॉर्ट को MFC या Windows API में किसी चीज़ के ऊपर स्तरित किया गया है, और संभवतः इसे Windows के पुराने संस्करणों से विरासत में मिला है, जहाँ MergeSort के बहु-थ्रेडेबल लाभ को कंप्यूटरों के लिए भी नहीं माना जाएगा। दिन। ( EDIT: MS-DOS के बाद से इसे लागू करने के इस विकल्प से स्पष्ट है, हालांकि Microsoft डेवलपर्स लंबे समय से क्विकॉर्ट फैनबॉय नहीं रहे हैं)।

जावा, जो किसी भी प्लेटफ़ॉर्म-विशिष्ट कार्यान्वयन का उपयोग नहीं कर सकता है क्योंकि जावा को पूरी तरह से प्लेटफ़ॉर्म-स्वतंत्र होने के लिए खरोंच से डिज़ाइन किया गया था, एक अलग तरह से चला गया। कौन जानता है कि मर्जसर्ट शीर्ष पर क्यों आया; मेरा जंगली अनुमान यह है कि कार्यान्वयन ने कुछ प्रकार की प्रदर्शन प्रतियोगिता जीती बनाम कुछ अन्य प्रकार के डेवलपर्स के साथ आए, या फिर यह कि O (n) -स्पेस मर्जस्टॉर्ट सिर्फ सर्वश्रेष्ठ-मामले और सबसे खराब प्रदर्शन के मामले में कागज पर सबसे अच्छा लग रहा था (MergeSort में QuickSort जैसे तत्व चयन से संबंधित कोई Achilles एड़ी नहीं है, और इसका सबसे अच्छा मामला एक निकट-सॉर्ट की गई सूची है जबकि यह अक्सर QuickSort का सबसे खराब है)। मुझे संदेह है कि शुरू में मल्टीथ्रेडिंग लाभों पर विचार किया गया था, लेकिन वर्तमान कार्यान्वयन अच्छी तरह से मल्टीथ्रेडेड हो सकता है।


1
List<T>.Sortमें .NET CLR में लागू एक देशी विधि का उपयोग करता है (यदि आप एक कस्टम तुलना का उपयोग नहीं करते हैं), लेकिन OS पुस्तकालयों पर कोई निर्भरता नहीं है।
जॉय

1
@Keith - .NET कुछ भी शीर्ष पर स्तरित नहीं है और इसे प्लेटफ़ॉर्म स्वतंत्र होने के लिए डिज़ाइन किया गया था। आप कार्यान्वयन को यहाँ देख सकते हैं: github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
रॉबर्ट मैकलेन

@RobertMacLean - ".NET कुछ भी शीर्ष पर स्तरित नहीं है" एक सही कथन नहीं है, हालांकि आपने यह प्रदर्शित किया है कि प्रश्न में क्रमबद्ध फ़ंक्शन पूर्ण रूप से "प्रबंधित" कोड है। क्रिप्टोग्राफी समर्थन, विंडोज डेस्कटॉप जीयूआई लाइब्रेरी, विंडोज एपीआई इंटरॉप (प्रक्रिया और सूत्रण नियंत्रण सहित) सहित .NET के बड़े हिस्से, सभी MFC सहित पूर्व-अप्रबंधित कोड पर आधारित हैं। उन्हें बस होना है; विंडोज के पास अपने
कोडबस

यह रहता है कि Microsoft देव अन्य कार्यान्वयन पर QuickSort के प्रशंसक साबित होते हैं, क्योंकि QuickSort MS-DOS के बाद से पसंद का एल्गोरिथ्म रहा है, और इससे इस एल्गोरिथ्म के साथ .NET के सॉर्टिंग को लागू करने के उनके निर्णय को प्रभावित किया होगा।
कीथ्स

यह जवाब बहुत गलत है मैं ईमानदारी से हैरान हूं।
user9993

17

दो अलग-अलग कंपनियों में अलग-अलग विकास दल अपने ढांचे और घटकों के लिए सामान्य उपयोग के मामले के बारे में अलग-अलग निष्कर्षों पर आए थे और तदनुसार लागू करने का फैसला किया है।

अनिवार्य रूप से, प्रत्येक कंपनी ने अपना विश्लेषण किया, अपने ग्राहक आधार को देखा और तदनुसार विभिन्न निर्णय लिए।

आप एक ही निष्कर्ष पर आने के लिए विभिन्न धारणाओं और कच्चे डेटा का उपयोग करके विभिन्न कंपनियों और टीमों द्वारा विश्लेषण की उम्मीद नहीं कर सकते।


5
या यहां तक ​​कि समान मान्यताओं और कच्चे डेटा। । ।
व्याट बार्नेट

हाँ, यह शायद आदत की ताकत थी - microsoft का उपयोग (अस्थिर) क्विकॉर्टोर्ट के लिए किया गया था, जावा स्थिर प्रकार के साथ जाना चाहता था ... और मर्ज सॉर्ट सबसे तेजी से ज्ञात स्थिर था ...
rogerdpack

12

यह प्रश्न थोड़ा पुराना है, क्योंकि जावा अब Timsort (जावा 7 के रूप में) का उपयोग करता है

उल्लिखित विशिष्ट एल्गोरिदम में:

  • क्विकॉर्ट का O (n ^ 2) पर प्रतिकूल सबसे खराब स्थिति वाला प्रदर्शन है, लेकिन यह थोड़ा अधिक हल्का / कम मेमोरी वाला है, इसलिए एक विशिष्ट मामले में बेहतर प्रदर्शन प्रदान करता है।

  • मर्ज्सर्ट ने ओ (एन लॉग एन) पर सबसे खराब प्रदर्शन की गारंटी दी है, लेकिन ओवरहेड और मेमोरी आवश्यकताओं को थोड़ा अधिक करता है। यह स्वचालित रूप से स्थिर है (अर्थात एक ही क्रम में समान तत्वों को बनाए रखता है)।

जावा डिजाइनर सामान्य रूप से थोड़ा अधिक रूढ़िवादी लगते हैं / "सही बात" पर ध्यान केंद्रित करते हैं, इसलिए यह आश्चर्य की बात नहीं है कि उन्होंने दो के बाहर मर्जेसर्ट को चुना क्योंकि यह बेहतर गारंटी प्रदान करता है।

सुनिश्चित नहीं हैं कि Microsoft ने क्विकसॉर्ट को क्यों चुना, हो सकता है कि वे इसे कुछ माइक्रो-बेंचमार्क में बेहतर दिखें?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.