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