从堆支持的最小优先级队列获取最大值的时间复杂度

时间:2017-12-11 22:19:26

标签: java max heap

我在网上遇到了一个问题,要求获得由堆支持的最低优先级队列中的最大值的平均时间复杂度。

我认为答案是O(n),因为堆由数组支持,并且遍历数组一次以找到最大值将进行n比较。

然而,答案是O(nlogn)。任何人都可以解释为什么会出现这种情况并且我的推理失败了吗?

1 个答案:

答案 0 :(得分:2)

可以由数组支持(如果您选择以这种方式实现它)。由于大多数编程语言都有数组,因此这样做是有意义的。但是从外面看,我们不能假设这一点。

是的,从技术上讲,你可以找到线性时间的最大值如果你有权访问数组,你就不会。示例...在Java中,您是否可以访问ArrayList类后面的动态大小的数组?不,因为Java不希望你弄乱它!

假设您只能使用Heap类公开的公共方法/属性......您很可能无法访问该数组。如果该阵列是公开可用的,则可以很容易地操作它,并且堆结构很容易受到损害。

我认为这个问题假定你会使用Heap的方法。在最小堆中,最大值将在最后(heapsort)出现,这需要n调用remove()函数,O(logn),所以{{1} }暗示heapsort是n * log(n)

简而言之,问题是要求堆排序的时间复杂度。