为什么pop()的大O和python中的pop(0)不一样
Why is the big O of pop() different from pop(0) in python
它们不应该都是 O(1)
,因为从 Python 列表中的任何位置弹出一个元素涉及销毁该列表并在新的内存位置创建一个元素?
Python 的 list
实现在幕后使用动态调整大小的 C array
,删除元素 通常 需要您移动元素following after up 以防止差距。
没有参数的 list.pop()
删除 last 元素。访问该元素可以在恒定时间内完成。后面没有元素,所以不需要移动。
list.pop(0)
删除 first 元素。 所有 个剩余元素必须向上移动一级,因此需要 O(n) 线性时间。
要添加到 Martin 的回答中,如果您想要一个两端都有恒定时间弹出的数据结构,请查看 collections.deque
。
它们不应该都是 O(1)
,因为从 Python 列表中的任何位置弹出一个元素涉及销毁该列表并在新的内存位置创建一个元素?
Python 的 list
实现在幕后使用动态调整大小的 C array
,删除元素 通常 需要您移动元素following after up 以防止差距。
list.pop()
删除 last 元素。访问该元素可以在恒定时间内完成。后面没有元素,所以不需要移动。
list.pop(0)
删除 first 元素。 所有 个剩余元素必须向上移动一级,因此需要 O(n) 线性时间。
要添加到 Martin 的回答中,如果您想要一个两端都有恒定时间弹出的数据结构,请查看 collections.deque
。