在Python中从列表中弹出元素的时间复杂度是多少?

时间:2008-10-12 15:58:59

标签: python

我想知道Python中列表对象的pop方法的时间复杂度是什么(特别是在CPython中)。 list.pop(N)的N值也会影响复杂性吗?

4 个答案:

答案 0 :(得分:33)

是的,弹出Python列表的 last 元素是O(1),O(N)弹出任意元素(因为整个列表必须转移。)

这是一篇关于如何存储和操作Python列表的精彩文章:http://effbot.org/zone/python-list.htm

答案 1 :(得分:26)

最后一个元素的

Pop()应该是O(1),因为你只需要返回数组中最后一个元素引用的元素并更新最后一个元素的索引。我希望pop()对于任意元素为O(N)并且需要平均N / 2次操作,因为你需要移动任何元素超出你在指针数组中移除一个位置的元素。 / p>

答案 2 :(得分:4)

简短的回答如下:https://wiki.python.org/moin/TimeComplexity

没有参数弹出其O(1)

使用pop参数:

  • 平均时间复杂度O(k)(k表示传入的数字为 pop的一个参数
  • 摊销的最坏情况时间复杂度O(k)
  • 最坏情况时间复杂度O(n)

平均时间复杂度:

  • 每次输入值时,该操作的时间复杂度为 O(n - k)。

  • 例如,如果您有9个项目的列表,而不是从列表末尾删除9个操作并从开头删除 列表是1个操作(删除第0个索引并移动所有 当前指数的其他要素 - 1)

  • 由于列表中间元素的n - k是k次运算,因此平均值可以缩短为O(k)。

  • 另一种思考方式是假设每个索引都从您的9个项目列表中删除一次。这将是总共45次行动。 (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45)

  • 45等于O(nk)并且因为弹出操作发生了O(n)次,所以你将nk除以n得到O(k)

摊销最坏情况时间复杂度

  • 想象一下,你有一个包含9个项目的列表。想象一下,您正在删除列表中的每个项目,并且最坏的情况发生,您每次都会删除列表中的第一项。

  • 由于每次总操作次数从9次减少到1次,列表会缩小1.

  • 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45.45等于O(nk)。由于你做了9次操作而9是O(n)来计算摊销的最坏情况你做O(nk)/ O(n)等于O(k)

  • 说明它的平均和摊销的最坏情况时间复杂度的O(n)也是正确的。请注意,O(k)大约是O(1 / 2n)并且下降常数等于O(n)

最差案例时间复杂性

  • 与摊销的最坏情况时间复杂度不同,您不会考虑数据结构的状态,只考虑任何单个操作的最坏情况。
  • 在这种情况下,最糟糕的情况是您必须从列表中删除第一项O(n)时间。

Here's what I to think this through in case it helps:

答案 3 :(得分:2)

使用L.pop(-1)应该是O(1),使用L.pop(0)应该是O(n)

请参见以下示例:

from timeit import timeit
if __name__ == "__main__":
    L = range(100000)
    print timeit("L.pop(0)",  setup="from __main__ import L", number=10000)
    L = range(100000)
    print timeit("L.pop(-1)", setup="from __main__ import L", number=10000)

>>> 0.291752411828
>>> 0.00161794329896