【问题标题】:Implement an iterator on a binary heap在二叉堆上实现迭代器
【发布时间】:2019-09-29 08:48:49
【问题描述】:

我正在寻找一种在二进制堆(最大或最小)上实现迭代器的方法。

也就是说,通过第i次使用它的nextNode()函数,可以得到堆中第i个(更大或更小的)元素。

请注意,此操作在没有实际提取堆的根的情况下发生!

我最初的想法是:

  • 其实是抽取i个元素,压入栈,得到第i个值后再插入回堆中。每个函数调用都需要 O(i*log(n))。
  • 保留一个辅助的排序数据结构,它可以允许在 O(1) 中查找下一个值,但更新需要 O(n)。

我了解这些方法会消除使用堆的好处,因此我正在寻找更好的方法。

【问题讨论】:

  • 我认为这与stackoverflow.com/questions/7650917/… 是同一个问题——您不必花费 O(i) 对已排序的辅助结构进行操作。
  • 你需要迭代器在堆变化时保持有效吗?
  • @Jeff 不,不一定。

标签: iterator heap binary-heap


【解决方案1】:

目前尚不清楚此解决方案的用例是什么,因此很难说什么会使解决方案可行或比任何其他解决方案更好。

也就是说,我建议对已经提出的一般“提取和排序”想法进行一些小改动:如果我们可以对数据结构进行更改,我们可以就地进行排序。 >

Wikipedia 上建议的基本实现是一个部分排序的底层列表。我们可以在第一次@987654323 时支付(希望)一次性O(n log(n)) 成本来对我们的堆进行排序@ 被调用,之后nextO(1)。至关重要的是,完全排序的列表仍然是有效的堆

此外,如果您考虑heapsort 算法,您可以从第二阶段开始,因为您从一个有效堆开始

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 2017-05-09
    • 2012-09-22
    • 2020-10-06
    • 1970-01-01
    • 2010-10-19
    • 2011-08-03
    • 2013-08-16
    • 2011-09-25
    相关资源
    最近更新 更多