2009-11-14 16 views
22

टिमसोर्ट नामक ब्लॉक पर एक (अपेक्षाकृत) नया प्रकार है। इसका उपयोग पायथन की सूची.sort के रूप में किया गया है, और अब the new Array.sort in Java 7 होने जा रहा है।ग्रोकिंग टिमसोर्ट

वहाँ some documentation और एक tiny Wikipedia article तरह और कुछ निम्न स्तर प्रदर्शन के मूल्यांकन के उच्च स्तर के गुण का वर्णन है, लेकिन अगर किसी को वर्णन करने के लिए क्या कर रही है Timsort कुछ स्यूडोकोड प्रदान कर सकते हैं मैं उत्सुक था, वास्तव में, और कुंजी क्या कर रहे हैं चीजें जो इसे ज़िप्पी बनाती हैं। (Esp। उद्धृत कागज, "आशावादी छंटाई और जानकारी सैद्धांतिक जटिलता।" के संबंध में)

(भी related StackOverflow post देखें।)

+2

यह लिंक पहले प्रश्न से http://svn.python.org/projects/python/trunk/Objects/listsort.txt बहुत स्पष्ट है। यह एक tweaked और अनुकूलित विलय प्रकार है। – dmckee

+0

मैं वास्तव में अपने "कुछ दस्तावेज" लिंक में उससे लिंक करना चाहता था। फिक्स्ड। मेरा प्रश्न विशेष रूप से उस दस्तावेज़ के प्रति प्रतिक्रिया था - मुझे यह नहीं मिला कि टिमसोर्ट को छद्मोड-आइश स्तर से समझने में यह सब उपयोगी हो। – Yang

उत्तर

12

एक अब नष्ट कर दिया ब्लॉग पोस्ट से संबंधित भाग का हवाला देते हुए: Visualising Sorting Algorithms: Python's timsort

timsort के कारोबार के अंत में एक mergesort कि पूर्व सॉर्ट किया तत्वों के रन पर चल रही है। यह सुनिश्चित करने के लिए न्यूनतम रन लम्बाई मिनरन चुना जाता है कि अंतिम विलय जितना संभव हो उतना संतुलित हो - 64 तत्वों के लिए, मिनर 32 होता है।विलय शुरू होने से पहले, सॉर्ट किए गए तत्वों के पूर्व-मौजूदा रनों का पता लगाने के लिए डेटा के माध्यम से एक ही पास किया जाता है। उतरने वाले रनों को आसानी से उन्हें स्थानांतरित करके संभाला जाता है। यदि परिणामी रन लम्बाई मिनरन से कम है, तो इसे सम्मिलन प्रकार का उपयोग करके कम करने के लिए बढ़ाया जाता है। किसी भी पूर्व-मौजूदा रन के साथ एक शफल सरणी पर, यह प्रक्रिया बिल्कुल हमारे अनुमान के समान दिखती है: मर्ज सॉर्ट के साथ विलय करने से पहले, प्रविष्टि प्रकार का उपयोग करके मिनरन तत्वों के प्री-सॉर्टिंग ब्लॉक।

[...]

  • timsort एक अवरोही रन मिल जाए और यथा-स्थान रन पराजयों। यह सीधे पॉइंटर्स की सरणी पर किया जाता है, इसलिए हमारे सुविधाजनक बिंदु से "तत्काल" लगता है।
  • रन अब प्रविष्टि प्रकार का उपयोग कर लंबाई minrun तक बढ़ा दिया गया है।
  • अगले ब्लॉक की शुरुआत में कोई रन नहीं मिला है, और पूरे ब्लॉक को सॉर्ट करने के लिए सम्मिलन प्रकार का उपयोग किया जाता है। ध्यान दें कि इस ब्लॉक के निचले हिस्से में क्रमबद्ध तत्वों का विशेष रूप से इलाज नहीं किया जाता है - टाइम्सॉर्ट उन रनों का पता नहीं लगाता है जो अवरुद्ध करने के लिए अवरुद्ध किए जा रहे ब्लॉक के बीच में शुरू होते हैं।
  • अंत में, विलय को मर्ज करने के लिए विलय का उपयोग किया जाता है।
+1

धन्यवाद। यह शायद उतना ही सुंदर है जितना मैं चाहता हूं कि मैं जो चाहता हूं उसे प्राप्त करूंगा। मेरा दूर लेना यह है कि यह सम्मिलन क्रम और रिवर्स-इन-प्लेस के साथ 32 elts के ब्लॉक ('minruns') तैयार करता है। – Yang

+4

लिंक मर चुका है ??? – Mike6679

8

जब यह में चला गया तो वहाँ कुछ चर्चा है यह परिवर्तन core-libs mailing list माध्यम से चला गया और वहाँ उपयोगी लिंक। यहां कोड समीक्षा परिवर्तन और original patch के साथ web rev है।

कोड में टिप्पणियां कहते हैं:

कार्यान्वयन टिप्पणी: इस कार्यान्वयन एक स्थिर, अनुकूली,
पुनरावृत्ति mergesort कि एन एलजी (एन) की तुलना की तुलना में अब तक कम की आवश्यकता है
जब इनपुट सरणी है आंशिक रूप से क्रमबद्ध, जबकि
पारंपरिक विलय का प्रदर्शन करते समय इनपुट सरणी
यादृच्छिक रूप से आदेश दिया गया है। यदि इनपुट सरणी लगभग क्रमबद्ध है,
कार्यान्वयन के लिए लगभग एन तुलना की आवश्यकता है।
अस्थाई भंडारण आवश्यकताओं एक छोटे से निरंतर से भिन्न लगभग
इनपुट सरणियों बेतरतीब ढंग से आदेश दिया इनपुट
सरणियों के लिए n/2 वस्तु संदर्भ के लिए हल कर लिए।

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

दफन पर पीटर मेक्लोरी के "आशावादी
छंटाई और जानकारी सैद्धांतिक जटिलता" से techiques,
चौथा वार्षिक ACM-सियाम संगोष्ठी की कार्यवाही में उपयोग करता है very useful link to the Python implementation details में है, और मुझे लगता है कि कोड के बाद, शुरू करने के लिए यह एक शानदार जगह है। इसके बारे में अविश्वसनीय रूप से उच्च स्तर होने के लिए, टाइम्सोर्ट सॉर्ट किए गए डेटा के रनों को ध्यान में रखते हुए और उस संरचना के दौरान उस संरचना का लाभ उठाकर प्रदर्शन में सुधार करता है।

+0

मैं वास्तव में अपने "कुछ दस्तावेज" लिंक में उससे लिंक करना चाहता था। फिक्स्ड। मेरा प्रश्न विशेष रूप से उस दस्तावेज़ के प्रति प्रतिक्रिया था - मुझे यह नहीं मिला कि टिमसोर्ट को छद्मोड-आइश स्तर से समझने में यह सब उपयोगी हो। – Yang