【问题标题】:What is the amortized time complexity of inserting an element to this structure?将元素插入此结构的摊销时间复杂度是多少?
【发布时间】:2016-10-14 09:09:31
【问题描述】:

假设您使用数组实现了一个堆,并且每次数组已满时,您将其复制到一个其大小翻倍的数组中。将元素插入堆的摊销时间复杂度(最坏情况下)是多少?

我认为我们有T(n) = n * n(这是最坏情况下一系列 n 操作的总成本的上限),然后根据一个公式的摊销复杂度是T(n) / n = n^n / n = n

但我认为这是非常错误的,因为直觉很清楚我应该得到log(n)或更低......那么我应该如何计算呢?

【问题讨论】:

  • 离题。不是编程问题。试试cs.stackexchange.com
  • 为什么?这里有一个数据结构标签和很多类似的问题。我认为你错了

标签: algorithm data-structures heap time-complexity amortized-analysis


【解决方案1】:

想象一下,您将 n 个元素插入以这种方式表示的堆中。您需要考虑两种不同的成本来源:

  1. 堆操作的成本,忽略底层数组大小调整。
  2. 数组调整大小的成本,忽略了总体堆操作。

(1) 的成本在 n 个总操作中是 O(n log n),因为每次堆插入都需要时间 O(log n)。

对于 (2) 的成本,请注意将数组大小加倍所做的工作与数组加倍时的大小成正比。这意味着您将执行 1 个工作单元将数组的大小从 1 翻倍,将 2 个工作单元将数组的大小从 2 翻倍,将 4 个工作单元将数组的大小从 4 翻倍,等等。这意味着总完成的工作是

1 + 2 + 4 + 8 + 16 + ... + 21 + log n ≤ 4n - 1 = O(n)

这个数学使用了这样一个事实,即在数组达到大小 n 之前,您最多只能将数组加倍 1 + log n 次,并且 1 + 2 + 4 + 8 + ... + 2k = 2k+1 - 1。这意味着在所有 n 次插入中,您执行 O(n) 工作会使数组加倍。

总体而言,跨 n 次操作完成的总工作量为 O(n log n),因此每次操作的摊销成本为 O(log n)。

【讨论】:

  • 我唯一不同意(或不理解)的部分是<= 4n-1。例如,初始数组大小 1,最终数组大小 16。移动的项目 1+2+4+8 = 15。或初始大小 32,最终大小 256。移动的项目 32+64+128 = 224。所以看起来应该是<= n-1.
  • 我知道调整大小的成本为 O(n)。我的问题是计算摊销时间复杂度的公式是什么? 最坏情况的摊销时间复杂度是什么意思?
  • @user3386109 反正一切都是 O(n),我只是给出了一个不错且宽松的上限。
  • @UFCInsider 本身没有“公式”。您只需将所有操作完成的总工作相加,然后除以操作数。 “摊销的最坏情况”成本将是可以完成的最大可能工作量除以操作数量。
猜你喜欢
  • 2020-04-17
  • 2011-06-25
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多