【问题标题】:Aggregate analysis for a sequence of n operations对 n 个操作序列的聚合分析
【发布时间】:2012-09-30 02:45:08
【问题描述】:

我试图在ith 操作成本i 的数据结构上的n 操作序列中查找每个操作的摊销成本,如果i 是2 和1 的精确幂除此以外。

我想我需要找到一种方法来将成本总和表示为一个数字n,但我被困住了。我可以看到特殊的、更昂贵的 i 值正在发生父级和更远的距离:

i = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...

所以,看起来我在 2 的第一个和第二个幂之间没有数字,然后是一个数字,然后是 3,然后是 7。当我看了一会儿时,我(如果关闭,请纠正我)发现jthkth 2 的幂之间的非 2 的幂的数量是 2^(j-1) - 1

但是我怎样才能将这一切联系在一起形成一个总和呢?我可以通过js 和 2 本身的实际幂的数量看到一些东西,但是我很难将它们整合到一个单一的概念中。

【问题讨论】:

标签: algorithm aggregate amortized-analysis


【解决方案1】:

我无法为总和提供封闭形式,但很明显,平均成本在 2 的幂处达到峰值,连续的峰值渐近到 3.0,在下一个 2 的幂之前衰减到渐近上升的下限迈向 2.0。

每个 (2^n) - 1 值严格在 2^n 和 2^(n+1) 之间对总成本贡献 1(导致平均值向下衰减),直到 2^(n+ 1) 增加 2^(n+1)。因此,从 2^n 开始到 2^(n+1) 结束的片段的平均贡献是 ((2^n)-1 + 2^(n+1)) / 2^n 或 (3 * 2^ n - 1) / 2^n,随着 n 的增加接近 3。

您可以在下面的摘录表格中看到这两种效果。希望这会有所帮助。

      i       sum  average
-------   -------  -------
      1:        1  1.00000
      2:        3  1.50000
      3:        4  1.33333
      4:        8  2.00000
    ...
      7:       11  1.57143
      8:       19  2.37500
    ...
     15:       26  1.73333
     16:       42  2.62500
    ...
     31:       57  1.83871
     32:       89  2.78125
    ...
     63:      120  1.90476
     64:      184  2.87500
    ...
    127:      247  1.94488
    128:      375  2.92969
    ...
    255:      502  1.96863
    256:      758  2.96094
    ...
    511:     1013  1.98239
    512:     1525  2.97852
    ...
   1023:     2036  1.99022
   1024:     3060  2.98828
    ...
   2047:     4083  1.99463
   2048:     6131  2.99365
    ...
   4095:     8178  1.99707
   4096:    12274  2.99658
    ...
   8191:    16369  1.99841
   8192:    24561  2.99817
    ...
  16383:    32752  1.99915
  16384:    49136  2.99902
    ...
  32767:    65519  1.99954
  32768:    98287  2.99948
    ...
  65535:   131054  1.99976
  65536:   196590  2.99973
    ...
 131071:   262125  1.99987
 131072:   393197  2.99986
    ...
 262143:   524268  1.99993
 262144:   786412  2.99992
    ...
 524287:  1048555  1.99996
 524288:  1572843  2.99996
    ...
1048575:  2097130  1.99998
1048576:  3145706  2.99998
    ...

【讨论】:

    【解决方案2】:

    每步摊销成本的范围从略低于 3(当 n 是 2 的幂)到略小于 2(当 n 是 1 小于 2 的幂),如下所示。

    令 K(n) 表示 n 步的总成本,令 T(n) 表示不超过 n 的 2 次方的成本。假设 n = 2^j。那么
    K(n) = n + T(n) - j
    正如通过将成本归因于每个步骤,然后添加 2 次方步骤的总成本,并减去 j 以获得这些步骤的重复计数。因为
    T(2^j) = 1 + 2 + 4 +...+ 2^j = 2^(j+1)-1 = 2*n-1,
    我们有
    K(n) = 3*n - j - 1,
    当 n 是 2 的幂时,摊销成本略小于 3。

    现在假设 n = 2^(j+1)-1。我们有
    K(n) = K(2^j) + n - 2^j
    (因为在步骤 2^j 之后有 n - 2^j 个单位成本步骤),即
    K(n) = (3*2^j - j - 1) + (2^(j+1) - 1) - 2^j,

    K(n) = 2*(2^(j+1)-1) - j = 2*n - j,
    当 n 比 2 的幂小 1 时,摊销成本略小于 2。

    【讨论】:

      【解决方案3】:

      每次操作的摊销成本最多为 3。您可以通过计算 n 次操作的总成本并将其除以 n 或通过收费参数来获得此值。收费参数可以构造如下。

      当 i 不是 2 的幂时,向 i 收取 1 的费用。否则,当 i 的形式为 2^k 时,操作成本将为 2^k,它将在以下位置的操作之间重新分配:[2^{k-1}+1, 2^k]。这可以通过将 [2^{k-1}+1, 2^k-1] 位置的每个操作的电荷增加 2 并将剩余的电荷 2 分配给 2^k 位置的操作来完成。重新分配后,任意位置最大电荷为3。

      【讨论】:

        【解决方案4】:

        n 次操作的总成本 -

        我是如何做到这一点的 -

        2 次方的成本 - 2 的前 n 次方之和为 。因为我需要数到 n 的幂,所以我将 n 替换为 log n 的下限。

        其他号码的成本 - 将有剩余的 号码具有单位成本。

        将两者相加,您将得出等式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-07
          • 1970-01-01
          • 2020-12-29
          • 1970-01-01
          • 2021-09-29
          • 1970-01-01
          • 1970-01-01
          • 2019-09-16
          相关资源
          最近更新 更多