【发布时间】:2020-02-04 04:53:55
【问题描述】:
列表末尾的append 和insert 有区别吗?列表末尾的insert 是常数时间操作吗?
nums = [1, 2, 3]
nums.append(4) # Time complexity: O(1)
nums.insert(len(nums), 5) # Time complexity: O(?)
根据 Python Wiki 中的 TimeComplexity 文章,append 的平均情况为 O(1),而 insert 的平均情况为 O(n)。但是,在Python tutorial 中提到:
...和
a.insert(len(a), x)等价于a.append(x)。
我不确定“等效”是否意味着“功能等效”或“时间复杂度等效”。有人知道吗?
【问题讨论】:
-
时间复杂度文章在一般情况下是正确的,因为
insert并不总是位于列表的末尾。 -
@ParitoshSingh 是的,我知道。我的问题是
insert的时间复杂度在插入到列表末尾的特殊情况下是否为 O(1)。 -
insert 中的
n实际上是需要移动的元素数量。如果不需要移动元素,则可以忽略该操作。在任何情况下,它仍然是 O(n) 的时间复杂度,因为大 O 表示法实际上并没有测量一些模糊甚至精确的时间复杂度,更多的是描述它们的运行时间/空间需求如何随着输入大小的增长而增长. More details at wikipedia. -
换句话说,
list.insert的平均值总是 O(n),并且 big-O 表示法不会对边缘情况(例如最好或最坏的情况;在您的情况下,可以简化为简单的操作list.append)。 -
更迂腐,
append摊销 O(1),而不是 O(1)。见this thread
标签: python list time-complexity cpython