computer-science - 在 O(1) 时间内删除带有父指针的堆?

标签 computer-science heap big-o

所以问题是: 假设最小堆使用父指针,每个节点都包含一个指向其父节点的指针,而根节点有一个空指针。给定一个指向节点的指针,该节点不是树的根,包含堆中的最大键,删除的复杂度是多少?

答案是 O(1) 但这对我来说没有意义。因为堆始终是平衡的,所以无法用相邻节点替换已删除的节点,因此必须缩放树的长度 O(log N) 才能找到树中最后输入的节点,对吗?为什么这个问题的答案不是 O(log N)?

例如:

按 1、100、2、3、4、5 的顺序插入堆,其中 1 作为根节点,100 和 2 及其子节点,3 和 4 作为 100 的子节点,5 作为 2 的子节点。

删除 100 需要将其替换为 5,这需要 O(log N) 时间来访问,对吗?

最佳答案

您正在寻找的概念是“摊销常数时间” - 即平均值为 O(1) - 即使有时单个操作需要更长的时间,就像上面的示例一样。看看this需要详细说明的问题。

关于computer-science - 在 O(1) 时间内删除带有父指针的堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924865/

相关文章:

algorithm - 如何为最长公共(public)子序列 (LCS) 的这种特殊情况找到更快的算法?

regex - (a+b)* 和 (a*b*)* 有什么区别?

c++ - "class prototypes"在 C++ 中可能吗?

java - 该相互递归代码的时间复杂度

big-o - O(fib n) 复杂度算法?

java - 反转 32 位无符号整数的位

c++ - 为什么 List 类必须包含一个 Node 结构作为私有(private)成员 C++

algorithm - 插入二进制堆 : Number of exchanges in worst case

c++ - 为什么 std::priority_queue::emplace 是对数的?

c# - 一个简单的代码顺序