从 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()
实施:
擦除操作是否也会在删除元素后更新堆?
我查看了 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()
实施: