在有n个元素的堆中,根最小的元素,可以及时找到第7个最小的元素
(A) Θ(n log n)
(B) Θ(n)
(C) Θ(log n)
(D) Θ(1)答案: (D)
解释:
为了找出第 k 个最小的元素,我们必须首先从堆中提取 6 个元素,然后结果堆的根将是第 k 个最小的。总时间复杂度 = 6 提取最小操作 = 6*log2n = O(log2n)
但是我们可以通过非破坏性地从堆中提取元素,使用一种巧妙的方法从堆中找出第 k 个最小的元素。我们将使用额外的空间来创建一个新的最小堆,它在任何时候都将包含最大 k 个元素。
算法 :
用旧堆的根(最小元素)初始化新堆的根元素
对于 k-1 次重复以下操作:
使用 extract-min 提取新的最小堆的根,并将从原始堆中提取的根的 2 个子节点插入到新堆中。结果堆将包含 k 个元素,其根将是原始堆中第 k 个最小的元素。这会在每次移除时将新堆增加 1(移除一个,添加两个),这意味着它永远不会容纳超过 K 个元素,因此移除一加二将花费 O(3*log(K)) .经过 k 次迭代,是 O(3*k*logk) = O(k*logk)。
为了实现这一点,新堆中的节点应该在原始堆中存储其对应节点的索引,而不是节点值本身。
对于 7 个元素,它将花费 7log7 = O(1) 时间,因为新堆将仅创建 7 个元素。
参见 https://www.geeksforgeeks.org/data-structures-and-algorithms-set-9/ 的问题 1
此解决方案由Pranjul Ahujka 提供
这个问题的测验