2011-10-31 14 views
6

Amसमझ और सुलझाने कश्मीर रास्ता विलय तरह

को

1) कश्मीर-वे की जरूरत मर्ज प्रकार 0 से N-1 की संख्याओं के यादृच्छिक क्रमपरिवर्तन सॉर्ट करने के लिए तुलना की संख्या की गणना।

2)

कश्मीर मार्ग द्वारा आवश्यक डेटा चाल की संख्या की गणना करने के लिए तरह विलय 0 से N-1 की संख्याओं के ओ तरह यादृच्छिक क्रमपरिवर्तन।

मैं समझता हूं कि कैसे 2-तरफा विलय प्रकार सही तरीके से काम करता है, और कोड को बहुत अच्छी तरह समझता है। मेरी समस्या अब मुझे नहीं पता कि कैसे शुरू करें और थोड़ी मदद की ज़रूरत है। मैं 2-वे विलय प्रकार को के-वे में कैसे परिवर्तित करूं ताकि मैं उपर्युक्त समस्याओं को हल कर सकूं।

मैंने थोड़ी देर के लिए गुगल किया है लेकिन मुझे "के-वे विलय सॉर्ट" को समझने में मदद करने के लिए कोई ट्यूटोरियल नहीं मिला है।

मुझे अच्छी व्याख्या की आवश्यकता है कि मुझे क्या करना है ताकि मैं इसे वहां से ले जा सकूं और इसे स्वयं कर सकूं।

जैसा कि मैंने कहा कि मैं 2-तरफ समझता हूं, तो मैं के-वे विलय प्रकार कैसे चला सकता हूं? मैं के-वे कैसे कार्यान्वित कर सकता हूं।

मदद के लिए धन्यवाद।

संपादित

** मैं कुछ पोस्ट http://bchalk.com/work/view/k_way_merge_sort कि BinaryHeap कश्मीर-वे मर्ज लागू करने के लिए इस्तेमाल किया जाना चाहिए पढ़ें। क्या ऐसा है या अन्य तरीके हैं?

** मैं अपनी सूची को के में कैसे विभाजित करूं? क्या ऐसा करने का एक विशेष तरीका है?

+0

के-वे विलय के लिए बाइनरी ढेर की आवश्यकता नहीं है। आपको केवल अपनी वस्तुओं की सूची में सबसे छोटी चीज़ों को खोजने का एक तरीका है, उस आइटम को हटाएं, और किसी अन्य आइटम को सूची में रखें। द्विआधारी ढेर अक्सर प्रयोग किया जाता है क्योंकि इसे लागू करना आसान है और छोटी सूचियों के लिए काफी कुशल है।लेकिन आप एक स्किप सूची या कुछ हद तक अन्य ढेर कार्यान्वयन, या कुछ अन्य प्राथमिकता कतार कार्यान्वयन का उपयोग कर सकते हैं। –

उत्तर

7

जब k > 2, प्रत्येक इनपुट धाराओं के प्रमुख तत्व आमतौर पर मिन्हैप संरचना में रखे जाते हैं। यह एन-वैल्यू के मिनिनम को ढेर करना बंद कर देता है, ढेर से उस मूल्य को पॉप करने के लिए, और संबंधित इनपुट स्ट्रीम से प्रतिस्थापन मान डालना आसान बनाता है।

एक ढेर O(lg2 k) प्रत्येक सम्मिलन के लिए तुलना करता है, इसलिए एन आइटमों के के-वे विलय के लिए कुल कार्य n * lg2(k) है।

Eventhough आप के बारे में सी # और जावा से पूछा, आप एक कश्मीर तरह से मर्ज के लिए अजगर मानक पुस्तकालय कोड को देखकर इसे कैसे करना सीख सकते हैं: http://hg.python.org/cpython/file/2.7/Lib/heapq.py#l323

अपने अन्य सवाल का जवाब करने के लिए, वहाँ कोई विशेष तरीका है अपनी सूची को समूहों में विभाजित करने के लिए। पहले एआर में पहले एन/के तत्वों को लें, अगले एन/के तत्वों को अगले में, आदि। प्रत्येक सरणी को सॉर्ट करें और फिर उपरोक्त वर्णित ढेर का उपयोग करके उन्हें मर्ज करें।

+1

आपके उत्तर के लिए धन्यवाद। मैं इसकी सराहना करता हूं –

+0

कोई समस्या नहीं। अपने विलय के साथ शुभकामनाएं :-) –

0

आप हमेशा 2-तरफा विलय की श्रृंखला के रूप में एक के-वे विलय के बारे में सोच सकते हैं, यानी, पहले और दूसरे के परिणाम के साथ 2-तरफा विलय करें, और तीसरा: Merge(Merge(L1, L2), L3) और इसी तरह। इसे दो बार विभाजित करना भी तेज़ होगा: Merge(Merge(L1, L2), Merge(L3, L4))। जैसा कि आप देख सकते हैं, के-वे तरह के प्रकार के लिए, आपको किसी प्रकार की लूप (रिकर्सन) की आवश्यकता होगी।

+0

आपके उत्तर के लिए धन्यवाद। मैंने अपनी पोस्ट को थोड़ा सा संपादित किया है। क्या आप मेरी मदद कर सकते हैं? धन्यवाद –

संबंधित मुद्दे