列表元素替换是否等价于先删后插?切片赋值时间复杂度是O(1)还是O(n)
关于Python列表切片赋值的时间复杂度解答
- 首先明确单元素赋值的情况:你提到的
列表访问元素为常数时间对应的是nums[i] = x这类单下标赋值操作,确实是*O(1)*时间复杂度,底层直接修改动态数组对应下标的指针指向即可,不需要操作其他元素。 - 你问的「列表元素替换是否等价于先删除再插入」要分场景判断:
- 单元素替换不等价于先删再插,没有额外的元素移动开销,就是O(1)复杂度。
- 切片赋值分两种情况讨论:
- 情况1:切片长度 == 右侧可迭代对象长度(即你给出的示例场景)
你提供的示例代码:
这里要替换的切片nums = [1,2,3,4,5,6] temp = [8,8,8] nums[2:5] = temp print(nums) # 输出: [1,2,8,8,8,6]nums[2:5]长度为3,temp长度也为3,不需要调整列表总容量,也不需要移动切片后面的元素,只需要依次替换切片对应位置的3个元素即可,时间复杂度为O(k),k为切片(右侧可迭代对象)的长度。你这个示例中k是3,属于固定小常数开销,但严格来说不是O(1),如果k随数据规模线性增长,复杂度也会同步线性增长。 - 情况2:切片长度 != 右侧可迭代对象长度
这种场景就等价于你说的「先删除对应切片元素,再插入新元素」,需要移动切片后方的所有元素来适配新的长度,时间复杂度为O(k + m),其中k是右侧对象的长度,m是原列表切片后方的元素数量。如果切片在列表头部,m接近整个列表长度n,复杂度就为O(n)。
- 情况1:切片长度 == 右侧可迭代对象长度(即你给出的示例场景)
内容的提问来源于stack exchange,提问作者Patrick_Chong
相关产品推荐
相关产品推荐

