아마도이 질문은 전에 요청되었습니다. CLRS (2nd Ed) 문제 6.5-8에서 온 것입니다.
정렬 된 목록을 하나의 정렬 된 목록으로 병합 하는 시간 알고리즘을 제공 하십시오. 여기서 은 모든 입력 목록의 총 요소 수입니다. (힌트 : 병합 에는 최소 힙을 사용하십시오 .)
있기 때문에 목록과 전체 분류 값을, 우리는 각 목록에 포함 된 가정하자 또한 목록의 각 엄격하게 오름차순으로 정렬됩니다 번호를, 그 결과를도 상승에 저장됩니다 주문.
내 의사 코드는 다음과 같습니다.
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
내 전반적인 복잡성은 됩니다. k 목록에서 다음 최소 요소를 찾기 위해 루프 내에서 루프 를 피하는 방법을 찾을 수 없습니다 . 다른 방법이 있습니까? 알고리즘 을 얻는 방법 ?