您能否解释为什么正确答案是对数的?我不明白。
假设从一个空的数据结构开始,我们在堆栈的大小调整数组实现中执行n
推入操作。 resize()
方法被调用多少次?
a)常量
b)对数(正确。resize()
方法仅在堆栈的大小为2的幂时才调用。在1和n
之间有〜log2n的2的幂。)>
c)线性
d)二次
答案 0 :(得分:0)
为了容纳新元素,当填充新元素时,完全填充的动态数组(或称大小调整数组)会将其容量加倍。对于动态数组的大多数常见实现都是如此。
最初,您的堆栈(通过动态数组实现)为空。当您按第一个元素时,它的大小将调整为1个元素的容量。当您按一下时,它会调整为2个元素的容量。当您按下第三个时,它将调整为4个元素的容量。因此,第4个元素没有调整大小。但是当您按5th时,它现在可以调整为8的容量。依此类推。
因此,如果您要推送n
元素,则在推送第1、2、3、5、9、17,...个元素时将调用resize()
。
那么resize()
被叫多少次?如果您忽略第一个元素,则在推送resize()
元素(其中(2^k + 1)th
)时会调用k = 0,1,2,3,4,5...
。由于在log2(n)
范围内几乎有[1,n]
个这样的数字,因此将调用resize()
的次数。因此,对数是正确的答案。