我正在阅读 CLRS 并且对练习 6.5-8 有一些问题。
给出一个 O(n lg k) 时间算法将 k 个排序列表合并为一个排序列表,其中 n 是所有输入列表中元素的总数。(提示:使用 min0heap 进行 k 路合并。)
正如大家所说,解决方案是,
1) 使用 k 个列表的第一个元素构建一个 k 元素最小堆,
2) extract-min() 从堆中获取最小元素并将其附加到结果列表中,
3) 从与我们刚刚从堆中提取的元素相同的列表中选择下一个元素。将其插入堆中并转到 2)。
我可以理解时间是 O(n lg k),但我没有得到步骤 3) 中选择的正确性。这似乎很明显,但有一些正式的证据吗?