1. 底层数据结构
- list 的底层是数组(array),其最大的时间空间消耗出现在存储元素增长超过当前数组分配的大小时,所有元素都必须移动到新的位置,尤其对于头部的插入与删除(O(n));
- 如果需要频繁对两端进行增删,可考虑使用 collections.deque;
2. deque 的特性
Python 中的 list 类型(使用其内部的 append:尾部进,和 pop 成员函数:尾部出,左端受限)能胜任 stack 的角色,但其在前端的 pop(或 insert)的操作时间都是线性级的。
而在 BFS(广度优先)这类算法中(尾部进,头部出),我们就需要一种双端队列(double-ended queue,deque)。这种队列通常都是用链表(其前后端的追加及 pop 都属于常数级操作)。
Python 本身在其标准库的 collections 模块中就提供了 deque 类。
from collections import deque
该类在右端:
- (1)append
- (2)extend
- (3)pop
左端:
- (1)appendleft
- (2)extendleft
- (3)popleft
在内部,deque 类的实现是一个块空间的双向链表,其中每个独立元素都是一个数组。尽管它与纯独立元素组成的链表近乎等效,但这样做能降低开销并且再实践中更为有效。例如,如果它是一个普通的列表,我们通过表达式 d[k] 就能访问到 d 队列中的第 k 个元素。同理,如果 deque 对象中的每个快空间中都有 b 个元素,那么我们就只需要遍历第 k/b 块空间就够了。