1 回答
TA贡献1788条经验 获得超4个赞
Python 中列表的大小是动态的。但由于动态列表的工作方式,并非所有追加都具有相同的成本。
最初为列表分配固定空间。当分配的空间已满并且我们想要追加一个元素时,会为列表分配一个两倍于先前空间的新空间,并将所有列表项复制到新位置。因此,如果分配的空间未满,则追加需要 O(1),但如果分配的空间已满,则需要 O(n)(因为我们需要先复制)。
追加 n 个项目的成本(假设最初分配了两个单位的空间):
(1) + (1) # costs of appending the first two items
+ (2+1) + (1) # costs of appending the next two items
+ (4+1) + (1) + (1) + (1) # costs of appending the next four items
+ (8+1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) # costs of appending the next eight items
+ (16+1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1)
+ (32+1) + ...
...
这2 + 4 + 8 + 16 + ... + n大约等于 2n。所以nappend次操作总共花费了2n。所以平均每项费用O(1)。这称为摊余成本。
添加回答
举报