我在接受采访时被问到:
从最大堆中获取min元素的最佳时间复杂度是什么?
我回答为O(1),假设堆大小已知,并且堆使用数组实现为二进制堆。按照我的假设,最小值为heap_array[heap_size]
。
我的问题是,如果这个答案是正确的。如果没有,那么正确答案是什么?
答案 0 :(得分:28)
我的问题是,如果这个答案是正确的。
不,那不对。您唯一的保证是,每个节点都包含其下面的子树的最大元素。换句话说,最小元素可以是树中的任何叶。
如果不是正确答案是什么?
正确的答案是O(n)。在每个步骤中,您需要遍历左侧和右侧子树以搜索最小元素。实际上,这意味着您需要遍历所有元素以找到最小值。
答案 1 :(得分:9)
最佳复杂性为O(n)
。草图证明:
n/2
个最低级别的节点。Omega(n)
次考试。绑定很紧,因为很明显我们可以在O(n)
中忽略我们的数组恰好是堆的事实。
道德:它可能被称为堆,因为(就像你卧室地板上的衣服堆一样),它很容易到达顶部而很难得到其余部分。
答案 2 :(得分:1)
Max heap中的Min元素:
在最后一级搜索= O(n / 2)= O(n)
用最后一个元素替换搜索到的元素,并将堆大小减少1 = O(1)
在替换元素上应用Maxheapify = O(log n)
总时间= 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)。
示例: