分类目录:《算法设计与分析》总目录
我们在《栈和队列》的文章中介绍了队列。传统的队列实现了一种先进先出的策略,二双向队列的可以实现从队头或者队尾添加或弹出的操作。
class collections.deque([iterable[, maxlen]])
返回一个新的双向队列对象,从iterable
(迭代对象) 数据创建,从左到右初始化。如果iterable
没有指定,新队列为空。
Deque
队列是由栈或者队列生成的(”double-ended queue”的简称)。Deque
支持线程安全,内存高效添加(append
)和弹出(pop
),从两端都可以,两个方向的大概开销都是
O
(
1
)
O(1)
O(1)复杂度。
虽然list
对象也支持类似操作,不过这里优化了定长操作和pop(0)
和insert(0, v)
的开销。它们引起
O
(
n
)
O(n)
O(n)内存移动的操作,改变底层数据表达的大小和位置。
如果maxlen
没有指定或者是None
,Deque
可以增长到任意长度。否则,Deque
就限定到指定最大长度。一旦限定长度的Deque
满了,当新项加入时,同样数量的项就从另一端弹出。限定长度Deque
提供类似Unix filter tail
的功能。它们同样可以用与追踪最近的交换和其他数据池活动。
双向队列Deque
对象支持以下方法:
-
append(x)
:添加x到右端。 -
appendleft(x)
:添加x到左端。 -
clear()
:移除所有元素,使其长度为0。 -
copy()
:创建一份浅拷贝。 -
count(x)
:计算Deque
中元素等于x的个数。 -
extend(iterable)
:扩展Deque
的右侧,通过添加iterable
参数中的元素。 -
extendleft(iterable)
:扩展Deque
的左侧,通过添加iterable
参数中的元素。注意,左添加时,在结果中iterable
参数中的顺序将被反过来添加。 -
index(x[, start[, stop]])
:返回x在Deque
中的位置(在索引start
之后,索引stop
之前)。 返回第一个匹配项,如果未找到则引发ValueError
。 -
insert(i, x)
:在位置i
插入x。如果插入会导致一个限长Deque
超出长度maxlen
的话,就引发一个IndexError
。 -
pop()
:移去并且返回一个元素,Deque
最右侧的那一个。 如果没有元素的话,就引发一个IndexError
。 -
popleft()
:移去并且返回一个元素,Deque
最左侧的那一个。 如果没有元素的话,就引发IndexError
。 -
remove(value)
:移除找到的第一个value
。 如果没有的话就引发ValueError
。 -
reverse()
:将Deque
逆序排列并返回 None 。 -
rotate(n=1)
:向右循环移动n步。 如果n是负数,就向左循环。如果deque
不是空的,向右循环移动一步就等价于deque.appendleft(d.pop())
, 向左循环一步就等价于deque.append(d.popleft())
。
Deque对象同样提供了一个只读属性:
-
maxlen
:Deque
的最大尺寸,如果没有限定的话就是None
。
除了以上操作,Deque
还支持迭代、封存、len(deque)
、reversed(deque)
、copy.copy(deque)
、copy.deepcopy(deque)
、成员检测运算符in
以及下标引用例如通过 deque[0]
访问首个元素等。 索引访问在两端的复杂度均为
O
(
1
)
O(1)
O(1)但在中间则会低至
O
(
n
)
O(n)
O(n)。 如需快速随机访问,请改用列表。