सबसे खराब स्थिति


35

मुझे अच्छे संसाधनों को खोजने में समस्या हो रही है जो स्थिर छँटाई एल्गोरिथ्म में सबसे खराब स्थिति । क्या किसी को किसी अच्छे संसाधनों का पता है?हे(nlnn)

बस एक अनुस्मारक, इसका अर्थ है कि यह पास में दिए गए सरणी का उपयोग करता है और सॉर्टिंग एल्गोरिथ्म केवल निरंतर अतिरिक्त स्थान का उपयोग करने की अनुमति देता है। स्थिर का अर्थ है कि समान कुंजी वाले तत्व उसी क्रम में उसी क्रम में दिखाई देते हैं जैसे कि उन्होंने मूल में किया था।

उदाहरण के लिए, भोले मर्ज प्रकार सबसे खराब स्थिति और स्थिर है लेकिन O ( n ) अतिरिक्त स्थान का उपयोग करता है। मानक क्विकॉर्ट को स्थिर बनाया जा सकता है, जगह में है लेकिन सबसे खराब स्थिति ( एन 2 ) है । हीप्सॉर्ट जगह में है, सबसे खराब स्थिति हे ( एन एल एन एन ) लेकिन स्थिर नहीं है। विकिपीडिया के पास एक अच्छा चार्ट है जिसमें छंटाई वाले एल्गोरिदम में कमियां हैं। ध्यान दें कि कोई छँटाई एल्गोरिथ्म नहीं है जो वे सूचीबद्ध करते हैं जिसमें स्थिरता की सभी तीन स्थितियां हैं, सबसे खराब स्थिति O ( n ln n)हे(nlnn)हे(n)हे(n2)हे(nlnn) और जा रहा है।हे(nlnn)

मुझे कटजैनन, पासनन और तेहोला द्वारा "प्रैक्टिकल इन-प्लेस मर्ज़ोर्ट" नामक एक पेपर मिला है , जो स्थिर मर्जर्ट वेरिएंट में सबसे खराब स्थिति होने का दावा करता है। यदि मैं उनके परिणामों को सही ढंग से समझता हूं, तो वे पहले 1 पर पुनरावर्ती रूप से (नीचे-ऊपर) विलय का उपयोग करते हैंहे(nlnn)सरणी के 4 और बाद का114सरणी के 2 और दूसरे1 काउपयोग करें12मर्ज करने के लिए स्क्रैच स्पेस के रूप में 4 । मैं अभी भी इस के माध्यम से पढ़ रहा हूँ कि क्या मैं उनके परिणामों की सही ढंग से व्याख्या कर रहा हूँ, इसकी कोई और जानकारी की सराहना की जाती है।14

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

यह विशुद्ध रूप से सैद्धांतिक हित है और मेरे पास कोई व्यावहारिक अनुप्रयोग नहीं है। मैं बस उस एल्गोरिथ्म को जानना चाहूंगा जिसमें इन तीनों विशेषताएं हैं।


यहाँ एसओ पर एक ऐसा ही प्रश्न है जिसका उत्तर प्रश्न में दिया गया संदर्भ देता है। मेरा मानना ​​है कि यह कोई डुप्लिकेट प्रश्न नहीं है क्योंकि मैं आगे स्पष्टीकरण, अधिक साहित्य, और किसी भी भाग्य के साथ एल्गोरिथम का वर्णन कर रहा हूं।
उपयोगकर्ता 834

1
इस सवाल को math.stackexchange.com पर देखें ।
20y पर Tsuyoshi Ito

क्विकॉर्ट में एक धुरी के चयन का अलग तरीका इसकी स्थिरता को क्यों नष्ट करेगा?
sv

@svick, एकमात्र तरीका जो मुझे पता है कि क्विकसोर्ट को सबसे खराब स्थिति में कैसे बनाया जाए यह है कि यादृच्छिक की तुलना में अधिक बुद्धिमानी से धुरी का चयन करें। जिस तरह से मैंने ऐसा करना सीखा वह चयन एल्गोरिथ्म का उपयोग करके था, जो कि मध्य-मध्ययुगीन एल्गोरिथ्म का उपयोग करता है, जो स्थिरता को नष्ट कर देता है। अगर मुझे कुछ याद आया, तो कृपया मुझे बताएं। हे(nlnn)
user834

@TsuyoshiIto, इसे एक उत्तर बनाने पर विचार करें। इसके अलावा, यदि आप एल्गोरिथ्म का संक्षिप्त विवरण दे सकते हैं, तो मुझे लगता है कि यह वास्तव में सहायक होगा।
user834

जवाबों:


6

कई एल्गोरिदम हैं जो उपरोक्त सभी हैं, और उनमें से सभी का आविष्कार पिछले 30 वर्षों में किया गया है।

संभवत: 2008 में किम और कुटज़्नर द्वारा संस्करण (विकीकोर्ट कहलाता है) सहित ब्लॉक सॉर्ट नामक एल्गोरिदम की श्रेणी शायद सबसे अच्छी है । यह न केवल स्थिर और पूरी तरह से इन-प्लेस (O (1) ट्रांसड्यूसरोमस मॉडल में ओवरहेड) है, यह भी अनुकूली है, और इस प्रकार लगभग छांटे गए सूचियों को क्रमबद्ध करने के लिए कम कदम उठाएंगे, पहले से ही क्रमबद्ध सूची के मामले में ओ (एन) तुलना में परिवर्तित। आप यहाँ C, C ++ और Java में एक कार्यान्वयन पा सकते हैं: https://github.com/BonzaiThePenguin/biki

ब्याज की भी ग्रेगसॉर्ट एल्गोरिथ्म (भी एक ब्लॉक सॉर्ट है) हुआंग और लैंगस्टन द्वारा (1989-1992), जो वास्तव में कई प्रकार के परीक्षण मामलों पर विकीस्पोर्ट को मात देता है। एक C ++ कार्यान्वयन यहाँ उपलब्ध है: https://github.com/Mrrl/GrailSort


8

आप एक इन-प्लेस, स्थिर मर्जर्ट लिख सकते हैं। देखें इस जानकारी के लिए। लेखक के अपने शब्दों में:

जगह में एक सुंदर - मर्ज एल्गोरिथ्म। रोटेशन कैसे काम करता है यह समझने के लिए उल्टे सरणियों पर इसका परीक्षण करें। सबसे स्थिर जगह में सबसे तेज ज्ञात। स्टैक विस्फोट का कोई जोखिम नहीं। लागत: चालों की अपेक्षाकृत उच्च संख्या। स्टैक अभी भी महंगा हो सकता है। यह एक मर्ज सॉर्ट है जिसके स्थान पर एक स्मार्ट मर्ज होता है जो उप सरणियों को घुमाता है। यह कोड C ++ stl लाइब्रेरी से कॉपी किया हुआ है और जावा में अनुवादित है।

मैं यहाँ कोड की प्रतिलिपि नहीं बनाऊँगा, लेकिन आप इसे लिंक पर या C ++ STL की जाँच करके पा सकते हैं। कृपया मुझे बताएं कि क्या आप चाहेंगे कि मैं यहां क्या हो रहा है, इसका अधिक विस्तृत विवरण प्रदान करने का प्रयास करूं।


8
हे(lnn)हे(1)हे(lnn)

नथ ने इसे TAoCP में भी संबोधित किया।
राफेल

हे(nln2n)

1

कृपया इसे कुछ व्यावहारिक विचारों पर एक लंबी टिप्पणी के रूप में लें। यद्यपि यह आपके प्रश्न का उत्तर नहीं है, लेकिन मुझे लगता है कि आप इस पायथन चर्चा में दिलचस्पी ले सकते हैं:

एलजी(एन!)एन-1

[...]

A और B की लम्बाई में समीप के रन को जोड़ना बहुत मुश्किल है । सैद्धांतिक निर्माण ज्ञात हैं जो यह कर सकते हैं, लेकिन वे व्यावहारिक उपयोग के लिए बहुत कठिन और धीमा हैं । लेकिन अगर हमारे पास मिन (ए, बी) के बराबर टेम्प मेमोरी है, तो यह आसान है।

स्रोत: Bugs.python.org , लेखक: टिम पीटर्स

हे(nलॉगn)

यह भी ध्यान दें कि Timsort पहले से सॉर्ट किए गए सरणियों पर अच्छा प्रदर्शन करता है।

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

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