【问题标题】:Why is the worst case runtime for delete for a min heap implemented as an array O(N)?为什么最小堆删除的最坏情况运行时实现为数组 O(N)?
【发布时间】:2015-05-17 09:22:01
【问题描述】:

    我正在处理来自 Practice Data Structures Final的练习题

问题

   当使用保持为最小堆的数据结构数组时,找出最坏情况的渐近运行时。

我最初的想法是删除操作是O(log n),因为删除的算法是

  1. 用结束元素交换开始元素。设置结束元素为空
  2. 减小大小
  3. 沿着树向下渗透新根
  4. 返回原始开始元素

步骤 1、2 和 4 都应该是常数时间。第 3 步应该在 O(log n) 中运行,因为完整树的高度是 log n。所以总的来说,删除的运行时间不应该是 O(log n)

但是,如果您查看答案键(来自链接),当使用保持组织为最小堆的数组时,删除的最坏情况渐近运行时间是 O(n)。有人可以解释为什么会这样吗?

【问题讨论】:

  • delete是指删除min还是在堆中查找并删除some元素?
  • 但是有了堆,你不应该只能删除最小值吗?这不是重点吗?
  • LinkedList为例。它既是List,又是Queue。这完全取决于您的 ADT 提供的 API。您的堆可能会在其他地方用作袋子或集合。
  • @Anonymous 但是删除本身会是 O(log n)?
  • 这是我对数组保持组织为最小堆的解释,是的。

标签: java arrays algorithm heap binary-heap


【解决方案1】:

来自Heap Definition - “如果二叉树具有堆属性并且是完整的树,则它只是一个堆”

感谢@SotiriosDelimanolis 的评论,我意识到这个问题只是一个堆,而不是特定ADT(指定数据结构支持的值和操作集)之后的堆,比如Priority Queue,所以可以从堆中删除任何值。

感谢@PaulHankin 的评论,我意识到在堆中找到一个值已经在 O(n) 中运行,并且移动必要的元素以保持完整的树属性也将在O(n)。因此,此堆上的删除操作在 O(n)

中运行

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多