我知道之前曾问过这个问题。我读了以下问题: how to determine if the kth largest element of the heap is greater than x 但我还有其他问题。我不想在一个旧的帖子中发帖。所以:
如果数字x
和数字k
,请检查x
是否大于k
中O(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)
?
答案 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
,我们只处理节点的子节点,因此我们可以包含23
和18
在12
的运行时间内(我们为12
执行了一定量的工作,包括23
和18
)和17
所涉及的工作{1}}的运行时间。