Höchstwahrscheinlich wird diese Frage schon einmal gestellt. Es ist aus CLRS (2nd Ed) Problem 6.5-8 -
Geben Sie einen -Zeitalgorithmus an, um sortierte Listen zu einer sortierten Liste zusammenzuführen, wobei die Gesamtzahl der Elemente in allen Eingabelisten ist. (Hinweis: Verwenden Sie einen Min-Heap für die Way-Zusammenführung.)
Da es sortierte Listen und insgesamt Werte gibt, nehmen wir an, dass jede Liste Zahlen enthält. Außerdem wird jede Liste in streng aufsteigender Reihenfolge sortiert und die Ergebnisse werden auch in aufsteigender Reihenfolge gespeichert bestellen.
Mein Pseudocode sieht so aus -
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
Meine Gesamtkomplexität wird . Ich konnte keinen Weg finden, die -Schleife innerhalb der -Schleife zu umgehen , um das nächste minimale Element aus k-Listen zu finden. Gibt es einen anderen Weg? Wie bekomme ich einen -Algorithmus?O ( k ) O ( n ) O ( n lg k )
4
eine zufällige Liste auswählen, wird möglicherweise8
der Heap eingefügt[7, 8, 10]
, von dem aus Sie7
statt5
in die Ergebnismenge einfügen , was falsch ist.Zunächst denke ich, dass Ihre Annahme, dass alle Listen Einträge haben, nicht gültig ist, wenn die Laufzeit des Algorithmus von der Länge der längsten Liste abhängt .n/k
Für Ihr Problem sollte der folgende Algorithmus den Trick ausführen:
quelle