【发布时间】:2017-01-24 04:03:42
【问题描述】:
我想知道Python中deque的get操作的时间复杂度。
我知道它在 Python 中被实现为双向链接。这是否意味着它的时间复杂度是 O(n)?
【问题讨论】:
我想知道Python中deque的get操作的时间复杂度。
我知道它在 Python 中被实现为双向链接。这是否意味着它的时间复杂度是 O(n)?
【问题讨论】:
deque 的实现比双向链表更智能。它们是 Python 对象的 块 的双向链表,其中左侧和右侧可能是不完整的块。
中间访问的Big-O成本仍然是O(n),但它有一个常数除数(依赖于实现,CPython 3.5 allocates blocks that can store 64 objects)。因此,如果您的 deque 有 1000 个成员,则在中间访问仍然只涉及大约 7-8 个“链表式”遍历,而不是 500 个左右。如果deque 很小(65 到 128 个元素,具体取决于空槽与头部和尾部块的对齐方式),那么查找任何元素的成本都是相等的。
【讨论】:
deques(链表可以)之间进行节点的零拷贝传输,中间的插入/删除是O(n)元素moves,而不是只是O(n) 节点遍历。 C++ 允许使用 std::list 进行类似的操作,但 C++ 的迭代器设计使此类节点传输“自然”而无需添加非标准 API。 Python 的迭代器协议不包含启用它所需的功能,因此您必须破解非标准的东西才能启用链表功能;如果你无论如何都不能使用链表功能,deque 绝对更好。
if (it != std::end(seq)) return *it++;);迭代器表示值本身的迭代,而不是序列中的真实位置。