检查x是否大于最小堆中的第k个最小数

时间:2014-06-01 20:38:57

标签: algorithm time-complexity binary-heap

我知道之前曾问过这个问题。我读了以下问题: how to determine if the kth largest element of the heap is greater than x 但我还有其他问题。我不想在一个旧的帖子中发帖。所以:

如果数字x和数字k,请检查x是否大于kO(k)个最小元素。

上一个问题做了同样的事情,但是使用max-sheaps而不是。那不是问题。

考虑二进制最小堆:

              1
      2               3
  12    17         50  90
23,18 80,88      51,52 91,92

x为19,k为6。

第6个最小元素是18。

如果我在另一个线程中执行算法,它将检查如下:

1+,2+,12+,23,18+,17+,80,88,3+

计数器增加时+发出信号。

算法如何知道18是k - 最小的数字,而不是3?

为什么23,80和88的检查不会干扰O(k)

1 个答案:

答案 0 :(得分:2)

  

算法如何知道18是第k个最小数字,而不是3?

与算法无关 - 它只是计算较小的数字 - 它不会跟踪哪一个是第k个最小的数字。

如果发现数字小于k,则它知道第k个最小数字小于x


如果我们想要实际找到第k个最小的数字,我们可能需要做O(k log k)工作,因为我们需要按顺序跟踪候选者,以便我们知道哪一个在第k个位置,或者我们可以做(预期)O(n)quickselect

  

为什么检查13,80,88不会干扰O(k)?

以这种方式思考 - 每个节点只有2个子节点,如果节点的子节点小于x,我们只处理节点的子节点,因此我们可以包含231812的运行时间内(我们为12执行了一定量的工作,包括2318)和17所涉及的工作{1}}的运行时间。