给定一个包含n个元素的列表,需要以某种方式使用堆来查找O(K)中的insetions和dele之后的最大k元素?

时间:2015-06-02 11:49:09

标签: algorithm

给定一个包含n个元素的列表,并给出K和列表中Kth元素的值。需要在列表中构建0(n)中的堆,在O(log n)中堆积的任何其他插入(添加不在列表中的其他元素),在O(n)中删除, 无论O(k)中堆中发生什么变化,如何找到最大的k元素? 例如:给定列表(2,4,6,10,9,12)并给出k = 3和值= 9, k最大的是10,9,12。之后如果删除10和12,k bigggest将是4,6,9。

1 个答案:

答案 0 :(得分:0)

维护:

  1. '大'最大堆,大小(n-k)
  2. '小'最小堆,大小为k。
  3. 在任何时间点,最大的k数都在较小的堆中。大堆的根是插入较小堆的候选者。

    插入号码后:

    • 如果它大于小堆的根,那么它应该在其中 最大-K。弹出小堆的根,并将新数字插入小堆。
    • 如果它小于K2的根 - 将其插入大堆。

    删除号码后:

    • 如果它小于小堆的根,则此数字仅存在于大堆中。找到它(在大堆中)并删除它。
    • 如果它大于较小堆的根 - 那么这个数字是最大的k之一。在小堆中找到它,删除它,然后弹出大堆的根目录 - 并将其插入到小堆中。

    此算法使用您提到的复杂性界限。