从 boost::fibonacci_heap 中删除一个元素会发生什么?

What happens when you erase an element from boost::fibonacci_heap?

擦除操作是否也会在删除元素后更新堆?

我查看了 boost 文档中的成员函数解释 fibonacci_heap 其中提到了 increase/decrease 操作之后发生的事情,但是当涉及到擦除时,唯一声明的是它擦除句柄指向的元素。

那是不是意味着堆在这之后被改造了?如果不是,被擦除的节点的子节点会怎样? 我是否漏掉了一些明显的东西?

从斐波那契堆中删除一个元素时,树会重新合并。作为一般规则,当斐波那契堆上的操作的摊销时间为 O(log(N)) 时,就会发生树合并。

从概念上讲,删除操作可以被认为是两个操作的组合:

  • 对于最小堆实现,删除是 Decrease-Key (O(1)) 和 Extract-Min (O(log(n)) 的组合。
  • 对于最大堆实现,删除是 Increase-Key (O(1)) 和 Extract-Max (O(log(n)) 的组合。

在实践中,通常会优化实现以避免不必要的步骤,但摊销的对数复杂度保持不变。对于 Boost.Heap 的 fibonacci_heap::erase() 实施:

  1. cuts off the link between the node and its parent
  2. moves the erase node's children to the root list
  3. consolidates the tree