我试图在数据结构的n次操作序列中找到每次操作的摊余成本,其中如果i是2的精确幂,则第i次操作成本i,否则为1. 我想我需要找到一种方法来表达成本n的总和,但我被卡住了.我可以看到特
我想我需要找到一种方法来表达成本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.当我看了一会儿,我(纠正我,如果这是关闭的)发现数量在第j个和第k个幂之间2的非幂2是2 ^(j-1)-1.
但是,如何将这些结合在一起进行求和?我可以看到js上的东西加上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
...
