Rất có thể, câu hỏi này được hỏi trước. Đó là từ vấn đề CLRS (2nd Ed) 6.5-8 -
Đưa ra thuật toán thời gian để hợp nhất các danh sách được sắp xếp vào một danh sách được sắp xếp, trong đó là tổng số phần tử trong tất cả các danh sách đầu vào. (Gợi ý: Sử dụng một đống nhỏ để hợp nhất -way.)
Vì có danh sách được sắp xếp và tổng số giá trị, chúng ta giả sử mỗi danh sách chứa các số , hơn nữa, mỗi danh sách được sắp xếp theo thứ tự tăng dần và kết quả cũng sẽ được lưu theo thứ tự tăng dần đặt hàng.
Mã giả của tôi trông như thế này -
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
Độ phức tạp tổng thể của tôi trở thành . Tôi không thể tìm thấy bất kỳ cách nào để tránh vòng lặp bên trong vòng lặp để tìm phần tử tối thiểu tiếp theo từ danh sách k. Có cách nào khác không? Làm thế nào để có được thuật toán ?O ( k ) O ( n ) O ( n lg k )