【问题标题】:Dynamic array implementation of stack栈的动态数组实现
【发布时间】:2019-07-20 07:08:53
【问题描述】:
程序员想要创建堆栈的动态数组实现,而不是使用重复加倍,而是在每次数组无法容纳更多元素时创建一个大小为 n+10 的新数组。
例如,为了插入第一个元素,将创建大小为0+10=10 的数组。插入10个元素后,为了插入第第11个元素,将创建一个大小为10+10=20的新数组,并将之前的数组元素复制到这个新数组中。 p>
这个堆栈实现的时间复杂度是多少?
【问题讨论】:
标签:
stack
time-complexity
【解决方案1】:
在 n 次插入后,数组的大小为 O(n),介于 n-10 到 n+10 之间。
让我们看看最后一次增加数组的时间。假设数组大小为n+10,计算如下:
尺寸变化 -> 10 次插入 -> 尺寸变化 -> 10 次插入 ....
n+10 -> 10 次插入 -> n -> 10 次插入 -> n-10 -> 10 次插入 -> ... -> n-n = 0 大小
到目前为止,对于 n 次插入,我们总共有:
Σ(n - 10*i) 次操作,Σ 从 i=-1 到 n
我们得到 n*n 总运行时间,现在我们除以 n 得到每个插入的运行时间,所以它变成 O(n),每个操作的摊销运行时间。
【解决方案2】:
为了容纳n*10 元素,数组必须增长n 倍,所以这可能看起来是O(n)。然而,增加一个数组需要将它的元素复制到新数组,这需要10第一次复制操作,20第二次,依此类推,直到n*10nth。所以我会说这是 O(n^2)。