Lo más probable es que esta pregunta se haga antes. Es del problema 6.5-8 de CLRS (2nd Ed)
Proporcione un algoritmo de tiempo para fusionar listas ordenadas en una lista ordenada, donde es el número total de elementos en todas las listas de entrada. (Pista: Utilice un min-montón para fusión -way.)k n k
Como hay listas ordenadas y un total de valores, supongamos que cada lista contiene números , además cada una de las listas está ordenada en orden estrictamente ascendente, y los resultados también se almacenarán en orden ascendente orden.n n
Mi pseudocódigo se ve así:
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
Mi complejidad general se convierte en . No pude encontrar ninguna manera de evitar el bucle dentro del bucle para encontrar el siguiente elemento mínimo de las listas k. ¿Hay alguna otra forma de evitarlo? ¿Cómo obtener un algoritmo ?O ( k ) O ( n ) O ( n lg k )