【问题标题】:What happens when you erase an element from boost::fibonacci_heap?当你从 boost::fibonacci_heap 中删除一个元素时会发生什么?
【发布时间】:2015-05-10 22:51:25
【问题描述】:

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

我在 boost 文档中对成员函数进行了解释 fibonacci_heap 中提到了增加/减少操作后会发生什么,但是当谈到擦除时,唯一声明的是它擦除了句柄指向的元素。

这是否意味着堆在此之后被重组?如果没有,被擦除节点的子节点会发生什么? 我错过了什么明显的东西吗?

【问题讨论】:

标签: c++ boost data-structures priority-queue fibonacci-heap


【解决方案1】:

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

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

  • 对于最小堆实现,Delete 是 Decrease-Key (O(1)) 和 Extract-Min (O(log(n)) 的组合。
  • 对于最大堆实现,Delete 是增加键 (O(1)) 和提取最大值 (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2011-08-25
    • 2010-11-15
    • 2013-04-01
    相关资源
    最近更新 更多