Швидше за все, це питання задають і раніше. Це з проблеми 6.5-8 CLRS (2nd Ed) -
Дайте алгоритм часу для об'єднання k відсортованих списків у один відсортований список, де 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 ( k ) всередині O ( n ) щоб знайти наступний мінімальний елемент із списків k. Чи є інший спосіб?алгоритм O ( n lg k ) ?