【问题标题】:Average life time of an element in the stack堆栈中元素的平均寿命
【发布时间】:2014-07-26 03:08:22
【问题描述】:

我遇到了以下问题:

令 S 为大小为 n >= 1 的堆栈。从空堆栈开始,假设我们按顺序压入前 n 个自然数,然后执行 n 个弹出操作。假设 Push 和 Pop 操作各花费 X 秒,并且从一个此类堆栈操作结束到下一个操作开始之间经过 Y 秒。对于 m >= 1,将 m 的堆栈寿命定义为从 Push(m) 结束到从 S 中删除 m 的弹出操作开始所经过的时间。此堆栈中元素的平均堆栈寿命为

问题的答案应该是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

有人能指出我的方法哪里出错了吗?

谢谢

【问题讨论】:

  • 生命周期是在推送/弹出的开始还是结束时开始/结束?我的意思是当n=1 是被认为是YX+YY+XX+Y+X 的元素的生命周期时?
  • 只是出于好奇:为什么要知道这个?
  • push 和 pop 都需要时间,并且两者之间存在间隔。您似乎只计算推送所需的时间(这就是您获得一半时间的原因)。

标签: c algorithm stack


【解决方案1】:

要找到一个元素的平均寿命,您应该将所有元素的寿命相加,然后将该结果除以元素的数量。所以:最后一个元素n 的生命周期是Y,因为它在被推送后立即弹出。倒数第二个(n-1)的生命周期是Y + X + Y + X + Y - 推送然后弹出n 加上两次暂停Y 所需的时间。展望未来,让 Ai 表示第 i 个元素的生命周期。然后Ai=Y + X + Ai+1+ Y + X(添加YX用于A的推送和弹出 i+1)。

所以我们得到了总和:

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 时,您将得到预期的值。

至于你哪里出错了:我看到的一个错误是你说:

从只添加中间元素到添加第n个元素的时间为n/2(X+Y)

而事实上这需要的时间是(n/2 - 1)(X+Y)。我选择了我的方法来解决问题,以避免在 n 是奇数或偶数时考虑不同的情况。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 2018-11-29
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    相关资源
    最近更新 更多