我试图在数据结构的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 ...