Algorithm 从最大堆中获取最小元素的时间复杂性
我在一次采访中被问到: 从最大堆中获取最小元素的最佳时间复杂度是什么 我的回答是O(1),假设堆大小已知,并且堆使用数组实现为二进制堆。这样,根据我的假设,最小值位于Algorithm 从最大堆中获取最小元素的时间复杂性,algorithm,heap,Algorithm,Heap,我在一次采访中被问到: 从最大堆中获取最小元素的最佳时间复杂度是什么 我的回答是O(1),假设堆大小已知,并且堆使用数组实现为二进制堆。这样,根据我的假设,最小值位于heap\u数组[heap\u size] 我的问题是,如果这个答案是正确的。如果不是,正确答案是什么 我的问题是,如果这个答案是正确的。 不,那不对。唯一可以保证的是,每个节点都包含其下子树的最大元素。换句话说,最小元素可以是树中的任何叶子 如果不是,正确答案是什么? 正确答案是O(n)。在每一步中,您都需要遍历左、右子树以搜索最
heap\u数组[heap\u size]
我的问题是,如果这个答案是正确的。如果不是,正确答案是什么
我的问题是,如果这个答案是正确的。
不,那不对。唯一可以保证的是,每个节点都包含其下子树的最大元素。换句话说,最小元素可以是树中的任何叶子
如果不是,正确答案是什么?
正确答案是O(n)。在每一步中,您都需要遍历左、右子树以搜索最小元素。实际上,这意味着您需要遍历所有元素以找到最小值。最佳复杂性是O(n)
。草图验证:
- 最小元素绝对可以是任何最低级别的节点(事实上,它甚至可能不在最低级别,但让我们从这些节点开始)
- 最低级别节点最多可有
n/2个
- 所有这些都需要检查,因为你要找的人可能在你最后找的地方。检查除1个之外的所有选项并不能告诉您最后一个选项是否是最小值
- 因此需要进行
检查Omega(n)
O(n)
中忽略数组恰好是一个堆这一事实来实现这一点
寓意:它可能被称为堆,因为(就像卧室地板上的一堆衣服一样)很容易到达顶部,而很难到达其余部分。Max heap中的Min元素:
总时间=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是最大值,但不在最低级别)
n/2
叶节点,这使得Omega
-界限更明显。“事实上,它甚至可能不在最低水平。”--最小元素不在最低级别的示例是什么?@Mansoor:max heap属性是每个子元素都比其父元素小。没有兄弟姐妹。因此,在根中考虑一个“10”堆。它有两个孩子“1”和“9”。“9”有两个孩子“8”和“7”。那么最小的值不在最低级别(尽管它必须是一个叶节点)。我们不能只查看数组的最后一个ceil(n/2)元素吗。仍然是O(n)。@gurudevala听起来这个问题没有指定实现。我认为,对实现进行假设将/不应该是有效的。**即使我们也可以只查看数组的最后一个单元格(n/2)元素。仍然是O(n)