Kemungkinan besar, pertanyaan ini diajukan sebelumnya. Ini dari masalah CLRS (2nd Ed) 6.5-8 -
Berikan algoritma waktu untuk menggabungkan diurutkan daftar menjadi satu daftar diurutkan, di mana adalah jumlah total elemen dalam semua daftar masukan. (Petunjuk: Gunakan min-heap untuk penggabungan k -way.)
Karena ada daftar diurutkan dan total nilai n , mari kita asumsikan setiap daftar berisi n angka, apalagi masing-masing daftar diurutkan dalam urutan naik, dan hasilnya juga akan disimpan dalam urutan naik.
Kode semu saya terlihat seperti ini -
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
Kompleksitas keseluruhan saya menjadi . Saya tidak dapat menemukan cara untuk menghindari loop O ( k ) di dalam O ( n )lingkaran untuk menemukan elemen minimum berikutnya dari daftar k. Apakah ada jalan lain? Bagaimana cara mendapatkan algoritma ?
4
, jika Anda memilih daftar acak, Anda mungkin berakhir menyisipkan8
, dengan demikian tumpukan itu[7, 8, 10]
, dari mana Anda akan memasukkan7
alih-alih5
ke dalam set hasil, yang akan salah.Adapun masalah Anda, algoritma berikut harus melakukan trik:
sumber