Algorithm 从最大堆中获取最小元素的时间复杂性

Algorithm 从最大堆中获取最小元素的时间复杂性,algorithm,heap,Algorithm,Heap,我在一次采访中被问到: 从最大堆中获取最小元素的最佳时间复杂度是什么 我的回答是O(1),假设堆大小已知,并且堆使用数组实现为二进制堆。这样,根据我的假设,最小值位于heap\u数组[heap\u size] 我的问题是,如果这个答案是正确的。如果不是,正确答案是什么 我的问题是,如果这个答案是正确的。 不,那不对。唯一可以保证的是,每个节点都包含其下子树的最大元素。换句话说,最小元素可以是树中的任何叶子 如果不是,正确答案是什么? 正确答案是O(n)。在每一步中,您都需要遍历左、右子树以搜索最

我在一次采访中被问到:

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

我的回答是O(1),假设堆大小已知,并且堆使用数组实现为二进制堆。这样,根据我的假设,最小值位于
heap\u数组[heap\u size]

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

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

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

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

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

最佳复杂性是
O(n)
。草图验证:


  • 最小元素绝对可以是任何最低级别的节点(事实上,它甚至可能不在最低级别,但让我们从这些节点开始)
  • 最低级别节点最多可有
    n/2个
  • 所有这些都需要检查,因为你要找的人可能在你最后找的地方。检查除1个之外的所有选项并不能告诉您最后一个选项是否是最小值
  • 因此需要进行
    Omega(n)
    检查
界限很紧,因为我们显然可以在
O(n)
中忽略数组恰好是一个堆这一事实来实现这一点


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

Max heap中的Min元素:

  • 最后一级搜索=O(n/2)=O(n)

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

  • 在替换的元素上应用Maxheapify=O(日志n)


  • 总时间=O(n)+O(1)+O(logn)=O(n)最小元素->最大堆需要O(n)时间,最小堆需要O(1)时间。 最大元素->最大堆需要O(1)时间,最小堆需要O(n)时间。

    正确答案是O(n) 1) 从最大堆中查找最小元素的步骤 查找第n个最大值(它只是最小元素) 需要n(n-1)/2次比较==O(n^2) 2) 首先是数组 要查找最小元素,请应用选择排序第一遍 这需要O(n)个时间。 3) 在最大堆中逐个(最多)删除n个元素(这只是查找而已) 这将需要O(nlogn)时间。 在三种方法中,O(n)是最好的方法。 所以正确的答案是O(n)时间

    最佳复杂性是O(n)

    而不是在这里写了很多关于这方面的东西,
    MAX heap中的min元素,以及min heap中的MAX元素
    也可以处于(最低级别-1),但不总是处于最低级别。

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

    什么意思是有n/2要检查。 所以在大O项中,它等于O(n)

    类似情况的示例:

    • 最大堆[10,9,1,8,7](1是较小的值,但未在最低级别显示)
    • 最小堆[8,10,20,17,15](20是最大值,但不在最低级别)

    +1。但我只想说,“可能是任何一个叶节点”。@aioobe:那可能会更好,因为我很确定至少有
    n/2
    叶节点,这使得
    Omega
    -界限更明显。“事实上,它甚至可能不在最低水平。”--最小元素不在最低级别的示例是什么?@Mansoor:max heap属性是每个子元素都比其父元素小。没有兄弟姐妹。因此,在根中考虑一个“10”堆。它有两个孩子“1”和“9”。“9”有两个孩子“8”和“7”。那么最小的值不在最低级别(尽管它必须是一个叶节点)。我们不能只查看数组的最后一个ceil(n/2)元素吗。仍然是O(n)。@gurudevala听起来这个问题没有指定实现。我认为,对实现进行假设将/不应该是有效的。**即使我们也可以只查看数组的最后一个单元格(n/2)元素。仍然是O(n)