【问题标题】:Resizing dynamic array with the size of Fibonacci numbers使用斐波那契数的大小调整动态数组的大小
【发布时间】:2020-12-26 23:36:09
【问题描述】:

我们有一个斐波那契数大小的动态数组。假设 F(k) 是数组的当前大小(F(k) 是斐波那契数列的第 k 个数)。我们这里有两条规则: 1)如果在数组中插入一个元素后,数组元素的个数为F(k-1),我们创建一个大小为F(k+1)的新数组,并将之前的元素复制到新数组中。 2)如果从数组中删除一个元素后,数组元素的个数为F(k-3),我们创建一个大小为F(k-1)的新数组,并将之前的元素复制到新数组中。

起初,数组是空的,大小为 2。我们想证明对于每个动作序列(插入或删除),每个动作的摊销时间复杂度为 O(1)。

为了解决这个问题,我意识到在两个数组增长动作之间至少有 F(k-1)-F(k-2) 个动作,复制元素需要 O(F(k-1))时间。此外,在两个数组收缩操作之间至少有 F(k-2)+F(k-3) 次操作,复制元素需要 O(F(k-3)) 时间。 你能帮我解决这个问题吗?

【问题讨论】:

  • 即使复制是 O(F(k-1)),创建数组也不应该是 O(F(k + 1))?
  • 缺少的部分是 F(k-3)、F(k-2)、F(k-1) 和 F(k) 都是 Theta(phi^k) 其中 phi 是黄金比例。

标签: algorithm fibonacci dynamic-arrays amortized-analysis


【解决方案1】:

如果我们假设n = F(k),摊销分析是每次复制的总和,即T(n) = F(1) + F(2) + ... + F(k)。我们知道T(n) = F(k+2) -1

作为T(n) = F(k+2) - 1 = F(k+1) + F(k) - 1 = 2F(k) + F(k-1) - 1= 2*n + F(k-1) - 1< 3n - 1,因此摊销成本是T(n)/n < 3,这意味着T(n) = Theta(1)在摊销意义上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 2019-12-19
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多