在具有n个具有最小元素根的元素的堆中,可以及时找到第7个最小元素
(A) Θ(n log n)
(B) Θ(n)
(C) Θ(log n)
(D) Θ(1)答案: (D)
解释:
为了找出第k个最小的元素,我们必须首先从堆中提取6个元素,然后所得堆的根将是第k个最小。总时间复杂度= 6 Extract-min运算= 6 * log2n = O(log2n)
但是我们可以通过非破坏性地从堆中提取元素来使用聪明的方法从堆中找出最小的kth。我们将使用额外的空间来创建新的最小堆,该最小堆将随时包含最多k个元素。
算法 :
用旧堆的根(最小元素)初始化new-heap的根元素
对于k-1次,请重复以下步骤:
使用extract-min提取新的min-heap的根,并将提取的根的2个子级从原始堆中插入到新堆中。结果堆将包含k个元素,并且其根将是原始堆中第k个最小的元素。这会使新堆在每次删除时增加一个(删除一次,再加上两个),这意味着它永远不会容纳超过K个元素,因此remove-one-add-two将占用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提供
这个问题的测验