पाठ 42 / 42

K-way Merge

एक min-heap का उपयोग करते हुए k sorted lists को कुशलता से मिलाएँ, जो हर list से अगला-सबसे-छोटा उम्मीदवार रखता है।

Two-way merge से आगे

दो sorted lists को मिलाना दो pointers से O(n) है। k sorted lists के लिए, हर list से एक उम्मीदवार रखने वाला min-heap इसे सामान्यीकृत करता है: हमेशा सबसे छोटा pop करें, फिर उस list का अगला element push करें।

k sorted lists मिलाएँ

Heap को हर list के पहले element से भरें (उसके list/index के साथ चिह्नित ताकि पता चले अगला value कहाँ से लाना है)।

import heapq

def merge_k_sorted(lists):
    heap = []
    for i, lst in enumerate(lists):
        if lst:
            heapq.heappush(heap, (lst[0], i, 0))

    result = []
    while heap:
        val, i, j = heapq.heappop(heap)
        result.append(val)
        if j + 1 < len(lists[i]):
            heapq.heappush(heap, (lists[i][j + 1], i, j + 1))
    return result

Output:

merge_k_sorted([[1,4,5],[1,3,4],[2,6]])
# [1, 1, 2, 3, 4, 4, 5, 6]

Complexity और उपयोग

k lists में कुल n elements के साथ, यह O(n log k) में चलता है — heap में कभी k से ज़्यादा elements नहीं होते। Sorted log files मिलाने, external sorting, और 'k lists को कवर करने वाली सबसे छोटी range' जैसी समस्याओं में इस्तेमाल होता है।