关于《Cracking the Coding Interview》第6版扩容数组插入amortized time的疑问
理解《Cracking the Coding Interview》中扩容数组摊还时间的两种计算
嘿,这个细节我当年读这本书的时候也卡过!其实核心是两个场景的统计范围和初始假设不一样,咱们拆解开看就清晰了:
1. 第43页的O(2X):统计「所有操作的总耗时」
这个场景是从空数组开始,插入X个元素的完整过程,包含两部分时间:
- 基础插入操作:每个元素插入的直接耗时是1,X个元素就是
X的时间。 - 扩容复制操作:当数组满了的时候,需要把旧数组的元素复制到新的扩容数组里。假设每次扩容2倍,那复制的总次数是:1(第一次扩容,从容量1到2)+2(第二次扩容,从2到4)+4(第三次,4到8)+…+X/2(最后一次扩容,当X是2的幂时)。这个等比数列求和的结果是
X-1(首项1,公比2,和为2*(X/2) - 1 = X-1)。
把两部分加起来,总耗时就是X + (X-1) ≈ 2X,所以作者说总耗时是O(2X)。
2. 第89页的O(X):仅统计「扩容带来的额外复制耗时」
这里的场景是只计算扩容过程中复制元素的总时间,没有把每个元素的基础插入时间算进去。同样用等比数列求和:X/2 + X/4 + X/8 + … + 1,这个和的结果是X-1,近似为X,所以作者直接说这部分耗时是O(X)。
关键结论:两者并不矛盾
其实这两种说法本质是统一的:
- 总操作时间(基础+扩容)是O(2X),但摊还到每个元素的时间是
2X/X = 2,也就是O(1); - 仅扩容的额外时间是O(X),摊还到每个元素也是
X/X = 1,同样是O(1)。
作者只是在不同页面侧重了不同的统计维度——一个讲完整总耗时,一个讲扩容的额外耗时,最终指向的摊还时间结论(每个元素O(1))是一致的。
内容的提问来源于stack exchange,提问作者Fabrizio S
相关产品推荐
相关产品推荐

