【问题标题】:Resizing an array by a non-constant, continually通过非常量,不断地调整数组的大小
【发布时间】:2021-12-27 04:14:48
【问题描述】:

我想对动态数组进行摊销分析: 当我们执行一系列 n 次插入时,每当一个大小为 k 的数组填满时,我们就会重新分配一个大小为 k+sqrt(k) 的数组,并将现有的 k 值复制到新数组中。

我是摊销分析的新手,这是一个我还没有遇到的问题,因为我们每次都通过 不同的非常量值调整数组的大小。 (newSize=prevSize+sqrt(prevSize))

总成本应该是 Θ(n*sqrt(n)),因此每次操作需要 Θ(sqrt(n))。

我意识到每当 k >= c^2 对于某个常数 c,我们的数组就会增长 c。 让我们从一个大小为 k=1 的数组开始(假设 n 足够大,为了这个例子)。在 n 次插入之后,我们得到以下插入总成本 + 副本的总和:

1+1(=k)+1+2(=k)+1+3(=k)+1+4(=k)+2+6(=k)+2+8(=k) +2+10(=k)+3+13(=k)+3+16(=k)+4+20(=k)+4+24+4+28+5+33+5+38+6 +44+6+50+7…+n

我看到了模式,但我似乎无法计算边界。 我正在尝试使用各种摊销分析方法来限制这个总和。 让我们以会计方法为例,然后我认为每次插入需要 round([k+sqrt(k)]\sqrt(k)) 或只是 round(sqrt(k)+1) 个硬币,但它没有添加起来。

我很想得到您的帮助,以尝试正确找到 sqrt(n) 的上限和下限。

非常感谢! :)

【问题讨论】:

  • 作为提示,尝试分析何时调整大小规则为 k -> k+2*sqrt(k) + 1,从 k = 1 -> 4 -> 9 -> 16 -> ... -> b^2,我们当前的大小是 b^2。每个元素的(累积插入次数)的总和要容易得多,并且您的调整大小规则的摊销成本是这个成本的 1.0 倍到 3.0 倍。
  • @kcsquared 谢谢,这确实是一个更好的规则,但是这个调整大小的规则不是因为平方和而具有 Θ(n^2) 的摊销成本吗?

标签: arrays algorithm amortized-analysis


【解决方案1】:

最简单的方法是将每次调整大小操作与下一次调整大小之前的插入操作放在一起。

每个块的成本是O(k + sqrt(k)),每个块由O(sqrt(k))个操作组成,所以每个操作的成本是O((k + k0.5 )/k0.5) = O(k0.5 + 1) = O(k0.5)

当然你想要一个关于如果 n 的答案,但由于 k(n) 在 Θ(n) 中,O(k0.5) = O(N0.5)。

【讨论】:

  • 非常感谢马特!我相信这会解决它。
【解决方案2】:

所以在 WhatsApp 群里回答问题

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多