विलय कर दिया है एक "सामान्य में "मर्ज सॉर्ट करें, आप log2n
की गहराई तक पहुंचने तक सरणी को 2 तक विभाजित करते हैं और फिर विलय शुरू करते हैं। आकार m
के दो सरणी के प्रत्येक विलय में 2m
संचालन भी होंगे।
यह निम्न सूत्र के लिए आप हो जाता है (समय विश्लेषण में):
n/2 * 2 + n/4 * 4 + ... 1 * n = n * log2n
अब अगर आप एक तीन तरह से मर्ज करते हैं, आप 3. द्वारा सरणी बांट देगा पिछले विधि के साथ अंतर दोहरा है :
- विभाजन की गहराई अब
log3n
है।
- मर्ज के दौरान, 2 तत्वों की तुलना करने के बजाय, आपको कम से कम 3 तत्वों को खोजने की आवश्यकता है।
इसका मतलब है कि, सबसे बुनियादी कार्यान्वयन में, आप इस तरह के एक सूत्र मिल जाएगा:
n/3 * 2*3 + n/9 * 2*9 + ... 1 * 2*n = 2 * n * log3n
ध्यान दें कि 2 गुणा किया जाता है, क्योंकि तीन तत्वों की न्यूनतम खोजने 2 आपरेशन के होते हैं।
असम्बद्ध रूप से, ये दोनों Θ(nlogn)
दोनों हैं। हालांकि, शायद (मैंने कोशिश नहीं की है) अभ्यास में तीन-तरफा विलय प्रकार log3n
की वजह से बेहतर प्रदर्शन करेगा। फिर भी, चूंकि log2n
एन = 1000000 के लिए केवल 20 है, और log3n
समान संख्या के लिए 12.5 है, मुझे संदेह है कि यह अनुकूलन वास्तव में प्रभावी होगा जब तक कि n
काफी बड़ा न हो।
एक चालाक कार्यान्वयन के साथ, एक के-मार्ग विलय का विलय सॉर्ट पर वास्तव में अच्छा प्रभाव हो सकता है। विचार यह है कि एक बार जब आप कम से कम k
तत्व प्राप्त करते हैं, तो आप पहले से ही k-1
तत्वों के बीच संबंधों को जानते हैं जो कम से कम नहीं हैं। तो एक बार अपनी संबंधित सूची से उस न्यूनतम तत्व का उपभोग करने के बाद, आपको केवल उस सूची के नए मान की तुलना करने की आवश्यकता है और शेष k-1
तत्वों के संबंध में अपना ऑर्डरिंग ढूंढना होगा। एक ढेर का उपयोग करना, यह काफी तुच्छ होगा।
Jerry's answer भी देखना सुनिश्चित करें। मैं उनके साथ सहमत हूं कि मल्टीवे विलय की वास्तविक शक्ति कई डिस्क और समांतर प्रसंस्करण से निपटने से आती है।
मैं शायद कहूंगा [जेरी कहता है] (http://stackoverflow.com/a/14713825/912144) समांतर गणना और समांतर डिस्क पढ़ने के संबंध में हालांकि इसका मुख्य कारण है। – Shahbaz
सही, धन्यवाद शाहबाज, यह वास्तव में एक महान स्पष्टीकरण है अब जिस हिस्से को मैं समझ नहीं पाया था, 3 के समूहों में विभाजित करने के बाद आप विलय कैसे करेंगे? 3 के बाद मुझे पता है, मैं क्या करूँगा? मान लीजिए कि मैंने इसे 3-तत्व सरणी की शुरुआत में रखा है, अगले 2 तत्वों के बारे में क्या? क्या आप मुझे नमूना-एन-सरल कोड पर इंगित कर सकते हैं? क्षमा करें यह बेवकूफ लग सकता है, लेकिन वह हिस्सा है जिसे मैंने कभी 3-तरफा विलय में पकड़ा नहीं है। – ADJ
वही चीज जो आप 2 सरणी विलय के साथ करते हैं। आपके पास प्रत्येक सरणी के भाग के लिए एक पॉइंटर होगा जो अभी तक विलय नहीं हुआ है (शुरुआत में, यह सरणी की शुरुआत होगी)। एक बार जब आप न्यूनतम पाते हैं, तो आप इसे मर्ज किए गए सरणी में डाल देते हैं और उस तत्व से संबंधित पॉइंटर को अग्रिम करते हैं। यह वही समस्या है, आपके पास तीन पॉइंटर्स हैं, न्यूनतम खोजें, इसे मर्ज किए गए सरणी में संलग्न करें और उस पॉइंटर को अग्रिम करें। दोहराएँ। – Shahbaz