从堆支持的最小优先级队列中获取最大值的时间复杂度
Time complexity of getting max value from Min Priority Queue backed by a Heap
我运行在线提问,询问从堆支持的最小优先级队列中获取最大值的平均时间复杂度。
我认为答案是 O(n)
,因为堆由数组支持,遍历数组一次以找到最大值需要 n
次比较。
然而,答案是O(nlogn)
。谁能解释为什么会这样以及我的推理失败的地方?
堆可以由数组支持(如果您选择以这种方式实现)。由于大多数编程语言都有数组,因此这样做很有意义。但从外部来看,我们不能这样假设。
是的,从技术上讲,您可以在线性时间内找到最大值如果您可以访问数组,但您不会。示例...在 Java 中,您是否可以访问 ArrayList class 后面的动态大小数组?不,因为 Java 不想让你把事情搞砸!
假设您只能使用堆公开的 public 方法/属性 class...您很可能无法访问该数组。如果该数组 public 仅可用,则它很容易被操纵,并且堆结构很容易被破坏。
我认为该问题假设您将使用堆的方法。在最小堆中,最大值将在最后出现(堆排序),这将需要 n
调用 remove()
函数,即 O(logn)
,因此 n * log(n)
意味着堆排序是 O(n*logn)
.
简单来说就是问堆排序的时间复杂度
我运行在线提问,询问从堆支持的最小优先级队列中获取最大值的平均时间复杂度。
我认为答案是 O(n)
,因为堆由数组支持,遍历数组一次以找到最大值需要 n
次比较。
然而,答案是O(nlogn)
。谁能解释为什么会这样以及我的推理失败的地方?
堆可以由数组支持(如果您选择以这种方式实现)。由于大多数编程语言都有数组,因此这样做很有意义。但从外部来看,我们不能这样假设。
是的,从技术上讲,您可以在线性时间内找到最大值如果您可以访问数组,但您不会。示例...在 Java 中,您是否可以访问 ArrayList class 后面的动态大小数组?不,因为 Java 不想让你把事情搞砸!
假设您只能使用堆公开的 public 方法/属性 class...您很可能无法访问该数组。如果该数组 public 仅可用,则它很容易被操纵,并且堆结构很容易被破坏。
我认为该问题假设您将使用堆的方法。在最小堆中,最大值将在最后出现(堆排序),这将需要 n
调用 remove()
函数,即 O(logn)
,因此 n * log(n)
意味着堆排序是 O(n*logn)
.
简单来说就是问堆排序的时间复杂度