“下面假设输入已逐边核实,完整下载版会拒绝越界顶点、负权、非整数权和大于 C 的权。桶用双端队列的尾插与头删即可;不需要在每个桶内进一步排序。”
形式陈述
双端队列(deque)是一种抽象数据类型,其状态是有限序列
空队列上的弹出必须由接口规定为错误、空结果或禁止调用。只使用 push_back 与 pop_front 时,它退化为 FIFO 队列;只在同一端压入和弹出时,它表现为栈。
循环数组实现维护正容量
直觉
普通队列把进入端和离开端固定下来,deque 则允许算法根据局部结构选择把候选放到哪一端、从哪一端取走。序列次序仍是唯一的;灵活性来自两端都是合法更新位置,而不是取消顺序。循环数组通过让下标在存储区末端回绕,复用前端弹出后留下的空间,避免每次移动所有剩余元素。
存储是否连续、迭代器是否稳定以及能否按下标访问,取决于具体实现。需要这些能力时,应查阅所选容器的接口保证。
例子与边界
从空 deque 执行 push_back(a)、push_back(b)、push_front(c) 后,序列是 pop_back() 返回 pop_front() 返回
0–1 BFS 处理边权为
0–1 BFS独立算法页保留本段的快照约定,补出两个相邻距离层的不变量、每点至多两次入队及路径重建。它也给出第一次发现不能锁定距离的反例;这些结论是该零一权工作负载的性质,不是deque本身自动提供的优先队列保证。
数组实现发生扩容时,单次操作需要复制
推论与应用
Deque 统一覆盖 FIFO 与 LIFO 的端点行为,常用于工作窃取调度、回文扫描、0–1 BFS 和单调队列。选择实现时,应把算法实际需要的保证逐项对照:循环数组适合局部性与随机访问扩展,链式或分块结构适合稳定地址与避免整块搬迁;任何额外性质都应写在实现契约中。
Deque 直接取出的是首端或尾端元素。若算法能维持“所需候选始终位于端点”的不变量,例如 0–1 BFS 跳过旧项后取出距离最小的有效项,就能用端点操作完成选择;任意优先级的候选通常需要优先队列来维护最小者。
参考资料
- Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, §10.1, stacks and queues.
- Kurt Mehlhorn and Peter Sanders, Algorithms and Data Structures: The Basic Toolbox, Springer, 2008, Ch. 3, sequences and queue implementations.