सबसे शायद, यह सवाल पहले पूछा गया है। यह CLRS (2nd Ed) समस्या 6.5-8 से है -
एक सॉर्ट की गई सूची में कश्मीर सॉर्ट किए गए सूचियों को मर्ज करने के लिए टाइम अल्गोरिदम दें , जहां n सभी इनपुट सूचियों में कुल तत्वों की संख्या है। (संकेत: k -way विलय के लिए एक मिनट-ढेर का उपयोग करें ।)
जैसा कि क्रमबद्ध सूचियाँ और कुल n मान हैं, मान लें कि प्रत्येक सूची में n सम्मिलित है नंबर, सूचियों में से प्रत्येक को कड़ाई से आरोही क्रम में क्रमबद्ध किया गया है, और परिणाम भी आरोही क्रम में संग्रहीत किए जाएंगे।
मेरा छद्म कोड इस तरह दिखता है -
list[k] ; k sorted lists
heap[k] ; an auxiliary array to hold the min-heap
result[n] ; array to store the sorted list
for i := 1 to k ; O(k)
do
heap[i] := GET-MIN(list[i]) ; pick the first element
; and keeps track of the current index - O(1)
done
BUILD-MIN-HEAP(heap) ; build the min-heap - O(k)
for i := 1 to n
do
array[i] := EXTRACT-MIN(heap) ; store the min - O(logk)
nextMin := GET-MIN(list[1]) ; get the next element from the list 1 - O(1)
; find the minimum value from the top of k lists - O(k)
for j := 2 to k
do
if GET-MIN(list[j]) < nextMin
nextMin := GET-MIN(list[j])
done
; insert the next minimum into the heap - O(logk)
MIN-HEAP-INSERT(heap, nextMin)
done
मेरे समग्र जटिलता हो जाता । मुझे O ( n ) के अंदर O ( k ) लूप से बचने का कोई तरीका नहीं मिलाk सूचियों से अगला न्यूनतम तत्व खोजने के लिए लूप। क्या कोई और रास्ता है? एल्गोरिथ्म कैसे प्राप्त करें ?