我在网上遇到了一个问题,要求获得由堆支持的最低优先级队列中的最大值的平均时间复杂度。
我认为答案是O(n)
,因为堆由数组支持,并且遍历数组一次以找到最大值将进行n
比较。
然而,答案是O(nlogn)
。任何人都可以解释为什么会出现这种情况并且我的推理失败了吗?
答案 0 :(得分:2)
堆可以由数组支持(如果您选择以这种方式实现它)。由于大多数编程语言都有数组,因此这样做是有意义的。但是从外面看,我们不能假设这一点。
是的,从技术上讲,你可以找到线性时间的最大值如果你有权访问数组,你就不会。示例...在Java中,您是否可以访问ArrayList类后面的动态大小的数组?不,因为Java不希望你弄乱它!
假设您只能使用Heap类公开的公共方法/属性......您很可能无法访问该数组。如果该阵列是公开可用的,则可以很容易地操作它,并且堆结构很容易受到损害。
我认为这个问题假定你会使用Heap的方法。在最小堆中,最大值将在最后(heapsort)出现,这需要n
调用remove()
函数,O(logn)
,所以{{1} }暗示heapsort是n * log(n)
。
简而言之,问题是要求堆排序的时间复杂度。