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

Algorithm 检查x是否大于最小堆中的第k个最小数,algorithm,time-complexity,binary-heap,Algorithm,Time Complexity,Binary Heap,我知道以前有人问过这个问题。我看到以下问题: 但我还有更多的问题。我不想在这么旧的帖子里发帖。因此: 给定一个数字x和一个数字k,检查x是否大于k,O(k)中的第四个最小元素 上一个问题也做了同样的事情,但是最大堆数小于。这不是问题所在 考虑一个二进制最小堆: 1 2 3 12 17 50 90 23,18 80,88 51,52 91,92 设x为19,k为6 第六小元素是18 如果我在

我知道以前有人问过这个问题。我看到以下问题: 但我还有更多的问题。我不想在这么旧的帖子里发帖。因此:

给定一个数字
x
和一个数字
k
,检查
x
是否大于
k
O(k)
中的第四个最小元素

上一个问题也做了同样的事情,但是最大堆数小于。这不是问题所在

考虑一个二进制最小堆:

              1
      2               3
  12    17         50  90
23,18 80,88      51,52 91,92
x
为19,
k
为6

第六小元素是18

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

1+,2+,12+,23,18+,17+,80,88,3+
计数器增加时,
+
发出信号

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

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

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

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

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


如果我们真的想找到第k个最小的数字,我们可能需要做O(k log k)运算,因为我们需要按顺序跟踪候选对象,以便知道哪一个处于第k个位置,或者我们可以做(预期的)O(n)

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

这样考虑-每个节点只有2个子节点,我们只处理小于
x
的节点的子节点,因此我们可以在
12
的运行时间中包含
23
18
(我们为
12
做了大量的工作,包括
23
18
)以及
2
的运行时间中的
17