假设翻转位 #i花费2 i;因此,翻转位#0 花费1,翻转位#1 花费2,翻转位#2 花费4,依此类推。
Increment()
如果我们调用n次,调用 的摊销成本是多少?
我认为n增量的成本应该是n ·2 0 /2 0 + n ·2 1 /2 1 + n ·2 2 /2 2 + … + n ·2 n -1 /2 n -1 = n ( n -1) = O ( n 2 )。所以每个增量应该是O ( n ),对吧?但是作业要求我证明它是O (log n )。我在这里做错了什么?
假设翻转位 #i花费2 i;因此,翻转位#0 花费1,翻转位#1 花费2,翻转位#2 花费4,依此类推。
Increment()
如果我们调用n次,调用 的摊销成本是多少?
我认为n增量的成本应该是n ·2 0 /2 0 + n ·2 1 /2 1 + n ·2 2 /2 2 + … + n ·2 n -1 /2 n -1 = n ( n -1) = O ( n 2 )。所以每个增量应该是O ( n ),对吧?但是作业要求我证明它是O (log n )。我在这里做错了什么?
让我们有 p 位整数并遍历所有2^p
可能的值。
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
最右边的位是翻转2^p
次数(在每一步),所以总成本是2^p
第二位是翻转2^(p-1)
次数,但成本为 2,所以我们有总成本2^p
..
最重要的位被翻转一次,但有成本2^p
,所以我们有整体成本2^p
将所有位的成本相加,我们得到p*2^p
所有操作的全部成本。
每次操作(摊销)成本为p*2^p / 2^p = p
但请注意,这是比特数量的成本,我们必须用N
术语来表示
N = 2^p
so
p = log(N)
最后,每个操作的摊销复杂度是O(log(N))