【问题标题】:Understanding Amortized Time and why array inserts are O(1)了解摊销时间以及为什么数组插入是 O(1)
【发布时间】:2018-02-08 20:40:24
【问题描述】:

我正在阅读《Cracking the Coding Interview》,在 Big O 章节中,有关于 Amortized Time 的解释。此处使用了需要增长的诸如 ArrayList 之类的经典示例。当数组需要增长时,插入将花费O(N) 时间,假设它必须将 N 个元素复制到新数组中。这很好。

我不明白的是,由于数组的容量翻了一番,为什么每次插入的摊销时间是O(1) 据我所知,无论何时插入数组,它总是O(N)手术。摊销时间有何不同?我确定文字是正确的,我只是不理解O(1) 摊销时间的概念。

【问题讨论】:

  • 这里已经有答案Constant Amortized Time
  • 插入?你确定它没有说附加吗?
  • 随着阵列容量翻倍,阵列需要增长的概率呈指数下降,接近0。
  • @Dúthom 我的问题或多或少是如何插入数组 O(1)。我认为无论在什么情况下,插入总是 O(N)。
  • 时间考虑只有 ***n***→<_really big number_>。就实际与数组混淆的代码而言,是的,它是 O(n) (或更糟)。在应用程序的生命周期内调用与数组混淆的函数时,它所花费的时间接近一个特定的时间间隔,您可以将其设为 1。

标签: algorithm big-o amortized-analysis


【解决方案1】:

我正在回答您似乎感到困惑的问题,而不是您正式提出的问题。

您真正的问题是追加如何成为O(1) 操作。如果已经为数组的下一个元素分配了空间,那么追加只是更新有多少元素的记录,并复制条目。这是O(1) 操作。

如果您溢出可用空间,则仅追加是昂贵的。然后你必须分配一个更大的区域,移动整个数组,并删除前一个。这是O(n) 操作。但是,如果我们只每O(1/n) 次执行一次,那么平均它仍然可以达到O(n * 1/n) = O(1)

平均值是否重要取决于您的任务。如果您正在控制重型机械,那么在单个操作上花费太长时间可能意味着您无法尽快回到旋转的刀片上,这可能是官方错误的。如果您正在生成一个网页,那么重要的是一系列操作所花费的总时间,这将是操作次数乘以每个操作的平均时间。

对于大多数程序员来说,平均值才是最重要的。

【讨论】:

  • 这很棒而且真的很有帮助。谢谢。
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多