堆弹出操作的时间复杂度

3

长期以来,我一直认为堆中的弹出(pop)操作的时间复杂度是 O(1)

它是 O(1) 还是 O(log(n))


https://en.wikipedia.org/wiki/Heap_(data_structure) - Bernhard Barker
你知道pop函数的工作原理吗?从那里可以清楚地了解其运行时间。 - Bernhard Barker
@Dukeling,实际上这取决于具体的实现方式。如果我们使用数组来实现堆,我认为我们将不得不重新排列值,因此对于这种情况,我不认为它是O(1) - Ayoub Omari
堆是树的一种。尽管树可以表示为数组,但如果您真的想要,堆是一种基于树的数据结构。堆是抽象数据类型优先队列的最大效率实现之一,事实上,无论它们如何实现,优先队列通常被称为“堆”。 - Bernhard Barker
1个回答

11

好的,O(1) 只用于检索堆的根节点。要删除此根节点,所有堆实现都具有 O(log(n)) 的时间复杂度。例如,Python 中的 heapq 模块使用数组实现堆,而数组的第一个元素始终为堆的根节点。因此,在删除根节点时,需要进行从上到下的替换过程,需要花费 O(log(n)) 的时间,O(log(n)) 是总替换次数。

输入图像描述


3
你应该区分“堆”和“二叉堆”,其中“堆”是一种抽象的数据结构,“二叉堆”是最简单的变体,通常在数据结构课程中教授。 - meowgoesthedog
2
@meowgoesthedog,“抽象数据结构”这个术语听起来有点混淆;堆是一种数据结构(通常指二叉堆),它实现的抽象数据类型称为优先队列。 - kaya3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接