有人问我,在接受采访时:时间复杂度,以获得最大的堆最小元素
什么是从最大堆得到最小元素(S)的最佳时间复杂度?
我假设堆大小是已知的并且堆被实现为使用数组的二进制堆的O(1)。按照我的假设,最小值为heap_array[heap_size]
。
我的问题是,如果这个答案是正确的。如果不是,那么正确的答案是什么?
有人问我,在接受采访时:时间复杂度,以获得最大的堆最小元素
什么是从最大堆得到最小元素(S)的最佳时间复杂度?
我假设堆大小是已知的并且堆被实现为使用数组的二进制堆的O(1)。按照我的假设,最小值为heap_array[heap_size]
。
我的问题是,如果这个答案是正确的。如果不是,那么正确的答案是什么?
我的问题是,如果这个答案是正确的。
不,这是不正确的。唯一的保证是每个节点都包含它下面的子树的最大元素。换句话说,最小元素可以是树中的任意叶。
如果不是什么正确答案?
正确答案是O(n)。在每一步中,您都需要遍历左侧和右侧的子树,以便搜索最小元素。实际上,这意味着您需要遍历所有元素才能找到最小值。
最佳复杂度是O(n)
。素描证明:
n/2
最低级别的节点。Omega(n)
考试。这个界限很紧张,因为很明显我们可以在O(n)
中忽略这个事实,即我们的数组恰好是一堆。
道德:它可能被称为堆,因为(就像在你的卧室地板上堆放的衣服一样),很容易到达顶部,很难进入休息。从最大堆
+1。但我只想说,“可以是任何叶节点”。 – aioobe 2012-07-25 08:16:18
@aioobe:这可能会更好,因为我非常肯定至少会有'n/2'叶节点,这使得'欧米茄'更加明显。 – 2012-07-25 09:09:32
“事实上它甚至可能不在最低水平” - 什么是最小元素不在最低水平的例子? – 2012-07-25 20:56:49
敏元件:在末级
搜索= O(N/2)= O(N)
与最后一个元素替换搜索元素,并通过1减少堆大小= O(1)
替换元件上应用Maxheapify = O(log n)的
总时间= O(N)+ O(1)+ O(log n)的= O(n)的
MINIMUM_ELEMENT - >将需要O(n)的时间在最大堆和O的情况下,(1 )在最小堆的情况下。 MAXIMUM_ELEMENT - >如果是最大堆,则最多需要O(1)次,最小堆需要O(n)。
难道我们不能只看一下数组的最后一个ceil(n/2)元素。它仍然是O(n)。 – 2012-07-25 16:00:41
@GuruDevanla这听起来像这个问题没有指定一个实现。我认为,对执行做出假设将/不应该是有效的。 – 2014-08-19 00:59:58