【问题标题】:Amortized time of dynamic array动态数组的摊销时间
【发布时间】:2011-06-18 17:55:01
【问题描述】:

作为一个简单的例子,在动态数组的具体实现中,每次数组填满时,我们将数组的大小加倍。 因此,可能需要重新分配数组,在最坏的情况下,插入可能需要 O(n)。 但是,一个序列的 n 次插入总是可以在 O(n) 时间内完成,因为其余的插入是在恒定时间内完成的,因此可以在 O(n) 时间内完成 n 次插入。 因此,每次操作的摊销时间为 O(n) / n = O(1)。 --来自维基

但在另一本书中:每次加倍都需要 O(n) 时间,但发生如此罕见,以至于其摊销时间仍为 O(1)。

希望有人能告诉我这种罕见的情况是否可以推断出 Wiki 的解释?谢谢

【问题讨论】:

  • “其他书”什么也没说,它是一种描述 wiki 所说内容的模糊和不精确的方式。这是你的作业,不是吗?自己进行分析并弄清楚;)

标签: algorithm amortized-analysis


【解决方案1】:

摊销基本上是指每操作次数的平均值。

因此,如果您有一个 n 数组,则需要插入 n+1 个项目,直到需要重新分配为止。

所以,你已经完成了 n 次插入,每个插入都花费 O(1),另一个插入花费 O(n),因此您总共有 n+1 个操作,花费了您 2n 个操作

2n / n+1  ~= 1 

这就是为什么摊销时间仍然是O(1)

【讨论】:

  • 这里的成本不应该是2n+1吗?
  • @GauravSharma 否。因为当添加 n+1 个元素时,数组会加倍,这意味着复制了 'n' 个项目 + 附加了 1 个元素。因此进行了 n+1 次操作,转换为 O(n)。所以追加需要 O(n) 时间。如果我错了,请纠正我。
  • @SuryaTejaVemparala 附加只需要 O(n) 每 1/n 附加,所以平均而言它是无关紧要的。 2n / n+1 不是 ~= 1,而是 ~= 2 - 但通常会删除常量以进行 O() 分析。
【解决方案2】:

是的,这两种说法说的是同一件事,Wiki只是解释得更透彻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多