【问题标题】:amortized analysis on a binary heap二叉堆的摊销分析
【发布时间】:2019-08-10 15:33:14
【问题描述】:

所以一个常规的二叉堆有一个操作 extract_min 是 O(log(n)) 最坏的时间。假设 extract_min 的摊销成本为 O(1)。设 n 为堆的大小

因此,我们执行了 n 个 extract_min 操作的序列,它最初包含 n 个元素。这是否意味着整个序列将在 O(n) 时间内处理,因为每个操作都是 O(1)?

【问题讨论】:

  • 这对于 cs.stackexchange.com 来说可能是一个更好的问题。无论哪种方式 - 如果您运行 n O(1) 操作,那么是的,这需要 O(n)。如果你以某种方式结束每个 extract_min 操作都需要 O(log n),那么你会得到 O(n log n)。
  • 谁说 extract_min 摊销了 O(1) 成本?

标签: data-structures amortized-analysis


【解决方案1】:

让我们先解决这个问题:通过extract_min 操作删除堆中的所有元素需要 O(N log N) 时间。

这是事实,所以当您问“恒定摊销时间extract_min 是否意味着删除所有元素的线性时间?”时,您真正要问的是“extract_min 是否可以采用恒定摊销时间,即使它需要O(N log N) 时间提取所有元素?”

这个问题的答案实际上取决于堆支持的操作。

如果堆只支持addextract_min 操作,那么每个没有失败的extract_min(在恒定时间内)必须对应于之前的add。然后我们可以说add 需要摊销 O(log N) 时间,而extract_min 需要摊销 O(1) 时间,因为我们可以分配它的所有之前的add 的非恒定成本。

如果堆支持 O(N) 时间 make_heap 操作(摊销与否),那么它可以执行 N extract_min 操作而无需做任何其他加起来 O(N log N) 时间的事情。整个 O(N log N) 成本必须分配给 N extract_min 操作,我们可以声称extract_min 采用摊销常数时间。

【讨论】:

  • "如果堆只支持 add 和 extract_min 操作,那么每个没有失败的 extract_min(在恒定时间内)必须对应于之前的 add。那么我们可以说 add 需要摊销 O( log N) 时间,而 extract_min 需要分期 O(1) 时间,因为我们可以将其所有非常量成本分配给先前的添加。”如果是这样,插入需要 O(log(n)),那么 n 次操作需要 O(n) 时间吗?
  • 不。正如我所说,N 个 extract_min 操作需要 O(N log N) 时间。
猜你喜欢
  • 2015-05-20
  • 2021-06-02
  • 1970-01-01
  • 2013-11-08
  • 2016-03-16
  • 2012-10-22
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多