从max-heap获取min元素的时间复杂度

时间:2012-07-25 07:47:15

标签: algorithm heap

我在接受采访时被问到:

  

从最大堆中获取min元素的最佳时间复杂度是什么?

我回答为O(1),假设堆大小已知,并且堆使用数组实现为二进制堆。按照我的假设,最小值为heap_array[heap_size]

我的问题是,如果这个答案是正确的。如果没有,那么正确答案是什么?

6 个答案:

答案 0 :(得分:28)

  

我的问题是,如果这个答案是正确的。

不,那不对。您唯一的保证是,每个节点都包含其下面的子树的最大元素。换句话说,最小元素可以是树中的任何叶

  

如果不是正确答案是什么?

正确的答案是O(n)。在每个步骤中,您需要遍历左侧和右侧子树以搜索最小元素。实际上,这意味着您需要遍历所有元素以找到最小值。

答案 1 :(得分:9)

最佳复杂性为O(n)。草图证明:

  • 最小元素绝对可以是任何最低级别的节点(实际上它甚至可能不是最低级别,但让我们从这些节点开始)。
  • 最多可能有n/2个最低级别的节点。
  • 所有这些都需要检查,因为你要找的那个可能在你看的最后一个地方。检查它们中的全部但不能告诉您最后一个是否是最小值。
  • 因此需要Omega(n)次考试。

绑定很紧,因为很明显我们可以在O(n)中忽略我们的数组恰好是堆的事实。

道德:它可能被称为堆,因为(就像你卧室地板上的衣服堆一样),它很容易到达顶部而很难得到其余部分。

答案 2 :(得分:1)

Max heap中的Min元素:

  1. 在最后一级搜索= O(n / 2)= O(n)

  2. 用最后一个元素替换搜索到的元素,并将堆大小减少1 = O(1)

  3. 在替换元素上应用Maxheapify = O(log n)

  4. 总时间= O(n)+ O(1)+ O(log n)= O(n)

答案 3 :(得分:1)

MINIMUM_ELEMENT - >在Max堆的情况下需要O(n)时间,在Min堆的情况下需要O(1)。 MAXIMUM_ELEMENT - >在最小堆的情况下需要O(1)时间,在Min堆的情况下需要O(n)。

答案 4 :(得分:0)

正确答案是O(n) 1)从最大堆中查找最小元素         找到第n个max(除了最小元素之外什么都没有)         这将需要n(n-1)/ 2个比较== O(n ^ 2) 2)首先是数组         要找到最小元素,请应用选择排序第一遍          这将花费O(n)时间。 3)在最大堆中一一(最多)删除n个元素(仅查找而已)          这将花费O(nlogn)时间。 在3种方法中,最好的一种是O(n)。 因此正确答案将是O(n)时间

答案 5 :(得分:0)

最好的复杂度是O(n)。

与其在这里没有写很多有关,
最大堆中的 min 元素和最小堆
中的 MAX 元素 也可以处于(最低级别-1),而并不总是处于最低级别。

说明:
因为在堆中,可以选择从最低级别的右侧缺少节点,所以它可能不是平衡的(完全)树,这使得它也有叶子(较低的级别-1)。

这意味着要检查n / 2个。 所以从大的O角度来看,它等于 O(n)

示例

  • MAX-heap [10,9,1,8,7](1是较小的值,但没有出现在最低级别)
  • min-heap [8,10,20,17,15](最大值是20,但没有出现在最低水平)
相关问题