部分排序以找到第k个最大/最小元素

时间:2014-06-25 11:33:28

标签: algorithm sorting heap selection

来源:Wikipedia

  

使用堆或者也可以进行流式传输,单次传递部分排序   其他优先级队列数据结构。首先,插入第一个k   输入结构的元素。然后一次通过   剩下的元素,依次将每个元素添加到结构中,并删除   最大的元素。每次插入操作也需要O(log k)时间,   总体上导致O(n log k)时间。

  1. 这与我们首先在O(n)时间内堆积完整输入数组然后提取最少堆k次的情况有什么不同。
  2. 我不理解它对make one pass over the remaining elements, add each to the structure in turn, and remove the largest element所说的部分。这与1)中描述的方法相同吗?

1 个答案:

答案 0 :(得分:5)

建议的方法是流式传输。考虑到O(k)空间复杂度(但它只找到前k项),它不需要在内存中运行所有项来运行heapify算法。

该算法的更明确的描述(参见reference WP给出的)是

  • 给出了一系列项目:
  • 在流中创建第一个 k 元素的堆
  • 第一个 k 之后的每个元素的
    • 将它推到堆上,
    • 从堆中提取最大(或最小)元素并将其丢弃,
  • 最后返回堆中剩余的 k 值。

通过构造,堆永远不会增长到超过 k + 1个元素。这些项目可以通过磁盘,网络等进行流式传输,这是使用heapify算法无法实现的。