Deque随机访问python中的O(n)而C ++中的O(1),为什么?

时间:2017-09-04 18:14:54

标签: python deque

C ++ deque

  

随机访问 - 常数O(1)

Python deque

  

索引访问在两端都是O(1),但在中间减慢到O(n)。

如果我没有遗漏任何东西,那么对于python和C ++中的deques,其他一切都同样快,至少在复杂性方面。在某些情况下,有什么能让python的deque变得更好吗?如果没有,为什么他们不切换到C ++有什么?

2 个答案:

答案 0 :(得分:5)

免责声明:这个答案很大程度上取决于杰夫的评论以及Why is a deque implemented as a linked list instead of a circular array ?已发布的答案

你的问题本质上是不同的,但上面的标题本身就是一个答案:在Python中,模块collections.deque在访问中间项时具有线性时间复杂度,因为它是使用链表实现的。

来自pydoc:

  

针对其端点附近的数据访问优化的类似列表的序列。

现在,如果你想知道为什么选择了这个实现,那么答案已经在Jeff指出的帖子中提供了。

答案 1 :(得分:0)

因为Deque是一个应该以特定方式使用的数据,由第一个或最后一个元素访问, 但python有时会对其数据结构做一些奇怪的事情,并为它们添加更多功能,或使用组合数据结构

在这种情况下,python具有函数

remove(value)
#Remove the first occurrence of value. If not found, raises a ValueError.

这允许您访问deque中间的数据结构元素,它不是此数据结构的“核心”操作,

导致“但在中间减慢到O(n)。”

因为在这种情况下它的行为类似于数组(逐个检查值)