【问题标题】:time complexity of random access in deque in Python [duplicate]Python中双端队列中随机访问的时间复杂度
【发布时间】:2017-01-24 04:03:42
【问题描述】:

我想知道Python中deque的get操作的时间复杂度。

我知道它在 Python 中被实现为双向链接。这是否意味着它的时间复杂度是 O(n)?

【问题讨论】:

标签: python big-o deque


【解决方案1】:

deque 的实现比双向链表更智能。它们是 Python 对象的 的双向链表,其中左侧和右侧可能是不完整的块。

中间访问的Big-O成本仍然是O(n),但它有一个常数除数(依赖于实现,CPython 3.5 allocates blocks that can store 64 objects)。因此,如果您的 deque 有 1000 个成员,则在中间访问仍然只涉及大约 7-8 个“链表式”遍历,而不是 500 个左右。如果deque 很小(65 到 128 个元素,具体取决于空槽与头部和尾部块的对齐方式),那么查找任何元素的成本都是相等的。

【讨论】:

  • 真的很喜欢这些智能实现^_^
  • @zhy:是的;这个实现的缺点是你不能在deques(链表可以)之间进行节点的零拷贝传输,中间的插入/删除是O(n)元素moves,而不是只是O(n) 节点遍历。 C++ 允许使用 std::list 进行类似的操作,但 C++ 的迭代器设计使此类节点传输​​“自然”而无需添加非标准 API。 Python 的迭代器协议不包含启用它所需的功能,因此您必须破解非标准的东西才能启用链表功能;如果你无论如何都不能使用链表功能,deque 绝对更好。
  • 具体来说,问题在于,虽然 C++ 的迭代器协议让您在不推进迭代器的情况下让您知道当前位置的值是什么,并且对于大多数序列迭代器,允许您向前和向后移动迭代器, Python 只提供一个特性:告诉你下一个值并推进迭代器(类似于在 C++ 中做if (it != std::end(seq)) return *it++;);迭代器表示值本身的迭代,而不是序列中的真实位置。
猜你喜欢
  • 2020-08-10
  • 2020-01-28
  • 2019-10-07
  • 2015-03-31
  • 1970-01-01
  • 2010-12-30
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多