दिलचस्प पोस्ट
ओलेडीबी और मिश्रित एक्सेल आंकड़े: गायब डेटा किसी अन्य प्रक्रिया द्वारा उपयोग की जाने वाली एक फ़ाइल को पढ़ना क्या वेब सॉकेट्स के लिए मूल PHP समर्थन उपलब्ध है? दर्ज किए गए संपादन टेक्स्ट में पाठ साफ़ करें क्या मुझे एंटिटी फ्रेमवर्क 4.1 और एमवीसी 3 के साथ डायनामिक प्रॉक्सी को सक्षम या अक्षम करना चाहिए? त्रुटि: xxx डिस्क्वार्ड क्वालिफायर के 'यह' तर्क के रूप में XXX पास करना सी # का इस्तेमाल करते हुए एचटीटीपी फॉर्म कैसे जमा करें Base.base.method को कॉल करने के लिए कैसे? डेटा फ्रेम की सूची टाइमर और गेम लूप का उपयोग करना कैसे mysql डेटाबेस का आकार प्राप्त करने के लिए? सीतनिद्रा में होना, @ स्यूजेन्स जनरेटर और आवंटन आकार ऐप की शुरुआत में त्रुटि "बैटब्रेड ब्रिज नहीं मिल सका, सुनिश्चित करें कि आपका बंडल ठीक से पैक किया गया है" जावा की छुपी हुई विशेषताएं जावा RegEx मेटा वर्ण (।) और साधारण डॉट?

क्या जावा 7 विधि सरणियों के लिए टिम सॉर्ट का उपयोग करते हैं.सॉर्ट?

मुझे जावा 7 के प्रलेखन नहीं मिल रहा है, मैं केवल जावा 6 के बारे में पा सकता हूं, जो अभी भी त्वरित या मर्ज है। क्या किसी को पता है कि जावा 7 में विधि Arrays.sort के दस्तावेज कैसे Arrays.sort ?

वेब के समाधान से एकत्रित समाधान "क्या जावा 7 विधि सरणियों के लिए टिम सॉर्ट का उपयोग करते हैं.सॉर्ट?"

जावा 7 वस्तुओं के लिए primitives और TimSort के लिए दोहरे-पिवट क्विकोर्ट का उपयोग करता है

प्राइमटाइव के लिए जावा 7 एपीआई डॉक के अनुसार :

कार्यान्वयन नोट: सॉर्टिंग एल्गोरिथ्म व्लादिमीर यारोस्लावस्की, जोन बेंटले और जोशुआ बलोच द्वारा डुअल-पीवॉट क्विकोसोर्ट है। यह एल्गोरिथ्म ओ (एन लॉग (एन)) कई डेटा सेटों पर प्रदर्शन प्रदान करता है जो कि अन्य द्रुतशीरों को द्विघात प्रदर्शन में गिरावट के कारण होता है, और आमतौर पर पारंपरिक (एक-पिवट) क्वॉक्टेज कार्यान्वयन से तेज होता है।

वस्तुओं के लिए जावा 7 एपीआई डॉक के अनुसार :

कार्यान्वयन टिम पीटर्स की पायथन (टिमसोर्ट) के लिए सॉर्ट सॉर्ट के रूप में किया गया था। यह पीटर माइकलॉय की "ऑप्टीस्टिक सॉर्टिंग एंड इन्फॉर्मेशन थोरेटिक कॉम्प्लिसीटी" से तकनीक का उपयोग करता है, प्रोटीडिंग्स ऑफ द चौथा वार्षिक एसीएम-एसआईएएम सिमपोजियम ऑन असतत एल्गोरिदम, पीपी 467-474, जनवरी 1 99 3।

यकीन नहीं है कि यह जावा 6 में क्या था से बहुत अलग है:

जॉन एल बेंटले और एम। डगलस मैकिल्रॉय के "इंजीनियरिंग एक सॉर्ट फंक्शन", सॉफ़्टवेयर-प्रैक्टिस एंड एक्सपीरियंस, वॉल्यूम से अनुकूलित ट्यूनेड क्विकस्रोर्ट। 23 (11) पी। 1249-1265 (नवंबर 1993)

हाँ, जावा 7 Arrays.sort के लिए Timsort का उपयोग करेगा यहां कमेंट है: http://hg.openjdk.java.net/jdk7/jdk7/jdk/rev/bfd7abda8f79

हाँ! … और भी नहीं

सारांश

वर्तमान ओपन जेडीके 0 के कार्यान्वयन में टिम सॉर्ट का उपयोग आम तौर पर ऑब्जेक्ट्स (यानी, Arrays.sort(Object[]) और दोस्तों के छँटाई के लिए किया जाता है – लेकिन आदिम सरणियों के लिए, टिम सॉर्ट में शामिल है लेकिन सीमित नहीं है, इसका उपयोग किया जाता है उस मामले में, ह्युरिस्टिक्स का इस्तेमाल करने के लिए उपयोग किया जाता है, जो कि किस विधि का उपयोग करना है

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

विवरण

टिम सॉर्ट Arrays.sort(Object[] a) के अधिकांश प्रकार, जैसे Arrays.sort(Object[] a) लिए उपयोग किया जाता है, जब तक कि उपयोगकर्ता ने विशेष रूप से सिस्टम संपत्ति java.util.Arrays.useLegacyMergeSort सेट करके विरासत व्यवहार को अनुरोध किया है।

प्राथमिकताओं के लिए, स्थिति अधिक जटिल है। 1.8.0_111 8 (संस्करण 1.8.0_111 ) के अनुसार विभिन्न प्रकार के पौराणिक कथाओं का उपयोग एरे के आकार के आधार पर किया जाता है, आदिम प्रकार और सरणी के मापा "हल"। यहां एक सिंहावलोकन है:

  • बाइट्स 1 के अलावा अन्य सभी प्रकार के अन्य प्रकारों के लिए, 47 से कम तत्वों का सरणियों को बस प्रविष्टि सॉर्ट का उपयोग करके सॉर्ट किया गया है (देखें, DualPivotQuicksort.INSERTION_SORT_THRESHOLD ) यह दहलीज तब भी प्रयोग किया जाता है जब उप-सरणियों को क्रमबद्ध करते समय उत्पन्न होते हैं, जब मर्ज या क्वॉर्टसॉर्ट का उपयोग किया जाता है और उप-रेड का आकार थ्रेसहोल्ड से नीचे आता है। इसलिए कुछ प्रकार के सम्मिलन सॉर्ट का उपयोग सभी प्रकार से किया जाएगा, और छोटे सरणियों के लिए यह केवल एक ही एल्गोरिथ्म का उपयोग किया जाता है।
  • आदिम प्रकारों byte , short और char , एक गिनती सॉर्ट ऑब्जेक्ट सरणी के लिए उपयोग किया जाता है। यह एक सरल प्रकार है जो O(n + range) समय लेता है, जहां range की कुल संख्या बाइट (256) या लघु / चार (65536) मूल्य होती है सॉर्ट में range मूल्यों के एक अंतर्निहित सरणी को आवंटित करना शामिल है, इसलिए इसका उपयोग केवल तभी किया जाता है जब तत्वों की संख्या क्रमबद्ध करने के लिए कुल श्रेणी का एक महत्वपूर्ण अंश है। विशेष रूप से, यह 2 9 तत्वों (यानी ~ श्रेणी का 11%) से अधिक बाइट सरणियों के लिए, और 3200 तत्वों (~ 5% रेंज के) से अधिक छोटी / चाररे सरणियों के लिए उपयोग किया जाता है।
  • बाइट सरणियों के लिए, उपर्युक्त दो तरीकों में से एक हमेशा उपयोग किया जाता है।
  • सम्मिलन सॉर्ट दहलीज के ऊपर और long / char सरणी के लिए प्रविष्टि प्रकार की दहलीज के ऊपर और गिनती सॉर्ट थ्रेसहोल्ड के नीचे के लिए int और long सरणी के लिए, दो एल्गोरिदम में से एक का उपयोग किया जा सकता है: दोहरी धुरी द्रुतशीट, या मर्ज सॉर्ट करें कौन सा उपयोग किया जाता है, सरणी के समाधान की एक माप पर निर्भर करता है: इनपुट आरोही या अवरोही तत्वों के रनों में विभाजित है। यदि इस तरह की रनों की संख्या 66 से अधिक है, तो सरणी को अधिकतर क्रमबद्ध समझा जाता है और इसे दोहरे-पिवट क्विकटेंस्ट के साथ क्रमबद्ध किया जाता है। अन्यथा, सरणी को अधिकतर सॉर्ट किया जाता है, और मर्जर्सोर्ट का उपयोग किया जाता है (पहले से ही एन्यूमरेटेड रनों का इस्तेमाल शुरुआती बिंदु के रूप में)।

रन खोजने का विचार और फिर उन्हें सॉर्ट करने के लिए विलय का प्रयोग करना वास्तव में बहुत ही समान है, हालांकि कुछ अंतर हैं तो कम से कम कुछ मापदंडों के लिए, जेडीके एक रन-जागरूक विलय का प्रयोग कर रहा है, लेकिन कई अन्य पैरामीटर के लिए यह एक अलग एल्गोरिथ्म का उपयोग कर रहा है, और कम से कम 4 अलग एल्गोरिदम का उपयोग कुल में किया जाता है!

दलील

Object[] बनाम आदिम के विभिन्न प्रकार के व्यवहार के पीछे तर्क शायद कम से कम दो गुना है:

1) Object[] प्रकार Object[] को स्थिर होना जरूरी है: ऑब्जेक्ट जो समान रूप से समान रूप में इनपुट के रूप में दिखाई देंगे। आदिम सरणियों के लिए, ऐसी कोई अवधारणा नहीं है: पुरातनताओं को उनके मूल्य से पूरी तरह से परिभाषित किया गया है, इसलिए स्थिर और अस्थिर प्रकार के बीच कोई अंतर नहीं है। यह आदिम प्रकार की गति के पक्ष में स्थिर एल्गोरिदम की आवश्यकता के साथ वितरित करने की अनुमति देता है।

2) Object[] प्रकार Object[] को Object.compare() विधि को शामिल करने की आवश्यकता होती है, जो कि मनमाने ढंग से जटिल और महंगा हो सकता है यहां तक ​​कि यदि compare() विधि सरल है, तो आम तौर पर विधि को ऊपर की ओर कॉल करना होगा, जब तक कि संपूर्ण सॉर्ट विधि को 2 की रूपरेखा नहीं दी जा सकती। तो Object[] प्रकार Object[] आम तौर पर कुल तुलना को कम करने की दिशा में पक्षपात करेंगे, यहां तक ​​कि कुछ अतिरिक्त एल्गोरिथम जटिलता की कीमत पर।

दूसरी ओर, आदिम सरणियों के प्रकार, बस मूल रूप से तुलना करें, जो आम तौर पर एक चक्र या दो के क्रम पर लेते हैं। इस मामले में, एल्गोरिथ्म को तुलना की लागत और आसपास के एल्गोरिदम पर विचार करने के लिए अनुकूलित किया जाना चाहिए, क्योंकि यह एक ही परिमाण की संभावना है।


0 जावा 7 और जावा 9 के बीच के संस्करणों के लिए कम से कम, और निश्चित रूप से इसमें ओरेकल की जेडीके भी शामिल है क्योंकि यह ओपन जेडीके पर आधारित है। यह संभावना है कि अन्य कार्यान्वयन एक समान दृष्टिकोण का उपयोग करते हैं, लेकिन मैंने चेक नहीं किया है।

1 बाइट एरे के लिए, सम्मिलन सॉर्ट थ्रेसहोल्ड प्रभावी रूप से 29 तत्व है, क्योंकि इससे कम कटऑफ है, जिस पर गिनती सॉर्ट का उपयोग किया जाता है।

2 यह असंभव लगता है, क्योंकि यह काफी बड़ा है।