Provavelmente, essa pergunta já foi feita antes. É do problema do CLRS (2nd Ed) 6.5-8 -
Dê um algoritmo de tempo para mesclar listas classificadas em uma lista classificada, em que é o número total de elementos em todas as listas de entrada. (Dica: use um min-heap para mesclar -way.)
Como existem listas ordenadas e o total de valores, vamos assumir que cada lista contém nn , além disso, cada uma das listas é classificada em ordem estritamente crescente, e os resultados também serão armazenados em ordem crescente.
Meu pseudo-código se parece com isso -
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
Minha complexidade geral se torna . Não consegui encontrar nenhuma maneira de evitar oloop O ( k ) dentro do O ( n )loop para encontrar o próximo elemento mínimo das listas k. Existe alguma outra maneira de contornar? Como obter um algoritmo ?
4
, se você escolher uma lista aleatória, poderá acabar inserindo8
, portanto, o heap será[7, 8, 10]
, do qual você inserirá, e7
não5
no conjunto de resultados, o que estará errado.Antes de tudo, acho que sua suposição de que todas as listas possuem entradas não é válida se o tempo de execução do algoritmo depender do tamanho da lista mais longa .n/k
Quanto ao seu problema, o seguinte algoritmo deve fazer o truque:
fonte