我遇到了以下问题:
设S是一个大小为n> = 1的堆栈。从空堆栈开始,假设我们按顺序推送前n个自然数,然后执行n个pop操作。假设Push和Pop操作各占X秒,并且在一个这样的堆栈操作结束和下一个操作开始之间经过Y秒。对于m> = 1,将m的堆栈生命定义为从Push(m)结束到从S中删除m的pop操作的开始所经过的时间。该堆栈的元素的平均堆栈寿命是
问题的答案应该是n(X+Y)-X
。
我不明白为什么。有人可以解释一下吗?
我对问题的处理方法:
找出堆栈中任何对象的平均生命周期等同于查找堆栈中间元素的生命周期,在本例中为n/2
。
如果您认为n
是奇数,则n/2
完全划分列表
将中间元素添加到添加第n个元素的时间之间经过的时间是n / 2(X + Y)
推送第n个元素并弹出它之间经过的时间是Y
弹出所有元素直到下一个操作弹出n/2
元素(包括操作之间的等待时间,即Y
)之间经过的时间,n/2(X+Y)
Total time = (n/2)(X+Y)+Y
有人可以指出我的方法出错了吗?
由于
答案 0 :(得分:3)
要查找元素的平均寿命,您应该将所有元素的生命周期相加,然后将此结果除以元素数。所以:最后一个元素n
的生命周期是Y
,因为它在被推送后刚刚弹出。倒数秒(n-1
)的生命周期为Y + X + Y + X + Y
- 推送然后弹出n
加上两个暂停Y
所需的时间。前进让我们用A i 表示第i个元素的生命周期。然后A
i
=Y + X + A
i+1
+ Y + X
(添加Y
和{{ 1}}用于A i + 1 的推送和弹出。
所以我们得到了总和:
X
然后,当您将此值除以n时,您只得到预期的值。
至于你出错的地方:我看到的一个错误是你声明:
将中间元素添加到添加第n个元素的时间之间经过的时间是n / 2(X + Y)
实际上,所需的时间是Y + (Y + X + Y + X + Y) + (Y + X + (Y + X + Y + X + Y) + X + Y) ..... =
Y + 2 * (Y + X) + Y + 4 * (Y + X) + Y + 6 * (Y + X) + Y + ... 2 *(n - 1) * (Y + X) + Y =
n * Y + 2 * (Y + X) * (1 + 2 + ... (n - 1)) =
n * Y + 2 * (Y + X) * ((n - 1) * n) / 2 =
n * (Y + (n - 1) * (Y + X)) =
n * (n * Y + (n - 1) * X) =
n * (n * (Y + X) - X)
。如果n是奇数或偶数,我选择我的方法来解决问题以避免考虑不同的情况。