来源: 维基百科 使用堆或其他优先队列数据结构也可以实现流式单次部分排序。首先将输入的前k个元素插入该结构中,然后在剩余的元素上进行一次遍历,依次将每个元素添加到结构中并删除最大的元素。每个插入操作的时间复杂度也为O(log k),总的时间复杂度为O(n log k)。 这与我们先对完整的输入数组进行堆化(O(n)时间),然后从堆中抽取k次最小值有何不同? 我不理解它说要“对剩余元素进行一次遍历,依次将每个元素添加到结构中并删除最大的元素”那部分。这不与1)中描述的方法相同吗?
建议的方法是流式处理。它不需要将所有项目存储在内存中以运行堆化算法,因为它具有O(k)的空间复杂度(但它只能找到前k个项目)。算法的更明确描述(也可以参见reference WP)如下:- 给定一系列项目: - 对于流中的前k个元素创建一个堆, - 对于第k个元素之后的每个元素: - 将其推入堆中, - 提取最大(或最小)元素并丢弃它, - 最后返回堆中剩余的k个值。通过构造,堆永远不会增长到超过k+1个元素。可以从磁盘、网络等流式传输项目,这是使用堆化算法无法实现的。
Peek
是O(1)操作,这证明非常有效。 - Jim Mischel