Скорее всего, этот вопрос задавался раньше. Это из CLRS (2-е изд) проблема 6.5-8 -
Задайте алгоритм времени для объединения 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 списков. Есть ли другой путь? Как получить алгоритм ?
4
, если вы выбираете случайный список, вы можете в конечном итоге вставить8
, таким образом, будет куча[7, 8, 10]
, из которой вы будете вставлять7
вместо5
набора результатов, что будет неправильно.Что касается вашей проблемы, следующий алгоритм должен сделать свое дело:
источник