【问题标题】: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。当我看了一会儿时,我(如果关闭,请纠正我)发现jth 和 kth 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 的下限。
其他号码的成本 - 将有剩余的 号码具有单位成本。
将两者相加,您将得出等式。