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

在python中,Deque随机访问O(n),而在C+中访问O(1)+;,为什么?,python,deque,Python,Deque,C++: 随机存取-常数O(1) Python: 索引访问在两端是O(1),而在中间则减慢到O(n)。 如果我没有丢失任何东西,那么对于Python和C++中的其他事物来说,其他事情都是同样快的,至少是复杂的。在某些情况下,有什么能使python的deque更好?如果不是,为什么他们不转换到C++的什么? < P>免责声明:这个答案主要来自杰夫的评论和已经在上发表的答案。 你的问题在本质上是不同的,但是上面的标题本身就是一个答案:在Python中,模块集合。在访问中间的项目时,DeQE有一个线性

C++:

随机存取-常数O(1)

Python:

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


如果我没有丢失任何东西,那么对于Python和C++中的其他事物来说,其他事情都是同样快的,至少是复杂的。在某些情况下,有什么能使python的deque更好?如果不是,为什么他们不转换到C++的什么?

< P>免责声明:这个答案主要来自杰夫的评论和已经在

上发表的答案。 <>你的问题在本质上是不同的,但是上面的标题本身就是一个答案:在Python中,模块集合。在访问中间的项目时,DeQE有一个线性的时间复杂性,因为它是使用链表实现的。 从pydoc:

为接近其端点的数据访问而优化的类似列表的序列


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

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

在本例中,python具有以下功能

remove(value)
#Remove the first occurrence of value. If not found, raises a ValueError.
这允许您访问数据结构中间的数据结构元素。它不是此数据结构的“核心”操作

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


因为在本例中,它的行为类似于数组(逐个检查值)

实现细节。在这两种情况下,@IgnacioVazquez Abrams这不是重言式吗?@Sneftel你所说的“重言式”到底是什么意思?一切都是实现细节吗?随机访问不是deques的核心关注点。相反,这是所选方法的一个副作用,该方法可以在两端快速推送/弹出。Python使用链表,C++ STL倾向于使用块的向量。因此,Python插入几乎可以保证时间不变:新列表节点的内存分配加上值初始化。不幸的是,对链表任意元素的访问是O(n)。块向量允许快速随机访问,但可能需要O(n)个时间来重新组织任何给定插入的映射向量(尽管n个插入需要O(n)个时间)。相关问题