对n个操作序列的聚合分析

时间:2012-09-30 02:45:08

标签: algorithm aggregate amortized-analysis

我正在尝试在数据结构的n次操作序列中找到每次操作的摊余成本,如果ithi,则i操作费用为n确切的幂为2,否则为1。

我想我需要找到一种方法来表示成本总和i,但我被卡住了。我可以看到特殊的,更昂贵的jth值发生在父亲和更远的地方:

  

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

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

但是我怎么能将这一切联系起来呢?我可以看到{{1}}上的某些东西加上2本身的实际权力数量,但是我很难将它们整合到一个单一的概念中。

4 个答案:

答案 0 :(得分:2)

我不能提供一个封闭形式的总和,但很明显平均成本达到2的幂,连续的这样的峰值渐近到3.0,在下一个2的幂之前衰减到渐近上升的下限朝着2.0。

严格在2 ^ n和2 ^(n + 1)之间的(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
    ...

答案 1 :(得分:2)

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

设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的幂时,摊销成本略低于2。

答案 2 :(得分:1)

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

当我不是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.

答案 3 :(得分:1)

n次操作的总成本 -

enter image description here

我是如何到达这个 -

2的权力成本 - 2的前n次幂之和为enter image description here。由于我需要数字达到n的幂,我用log n的底部替换了n。

其他数字的费用 - 剩余的enter image description here个数字会有单位成本。

将它们都添加起来,您将得到等式。