【问题标题】:Deque random acces O(n) in python while O(1) in C++, why? [duplicate]在 python 中双端随机访问 O(n) 而在 C++ 中为 O(1),为什么? [复制]
【发布时间】:2018-02-13 00:01:12
【问题描述】:

C++deque:

随机访问 - 常数 O(1)

Pythondeque:

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

如果我没有遗漏任何东西,那么对于 python 和 C++ 中的双端队列来说,其他一切都同样快,至少在复杂性方面是这样。在某些情况下,有什么东西可以让 python 的双端队列更好吗?如果没有,他们为什么不直接切换到 C++ 所拥有的?

【问题讨论】:

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

标签: python deque


【解决方案1】:

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

在这种情况下python有函数

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

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

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

因为在这种情况下它的行为就像一个数组(一个接一个地检查值)

【讨论】:

    【解决方案2】:

    免责声明:此答案主要受 Jeff 评论的启发,并且该答案已发布在 Why is a deque implemented as a linked list instead of a circular array ?

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

    来自 pydoc:

    一个类似列表的序列,针对其端点附近的数据访问进行了优化。

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

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 2020-07-09
      • 2012-01-03
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 2020-10-19
      相关资源
      最近更新 更多