线性数据结构
线性结构按序列组织元素,但它们的表示方式和允许的操作并不相同。
对比
寻找内部节点或位置与修改它是两件事。“链表插入是 ”这句话隐含了相关节点或前驱已经可用这一前提。
选择规则
- 通用序列和以迭代为主的工作,优先使用动态数组。
- 当稳定的节点身份和局部拼接占主导时,考虑链式节点。
- 如果受限访问比通用列表更能表达算法不变量,就暴露栈或队列接口。
- 有界队列若要求存储可预测,可使用环形缓冲区。
在 Python 中,list 是对象引用的动态数组;collections.deque 支持高效的双端操作。
按下一步操作选择
需要直接取第 100 项时,读数组。算法已经持有节点、需要在旁边拼接时,读链表;只知道数字位置,并不等于已经拿到节点。要匹配最近一个尚未闭合的分隔符,用栈。要按到达顺序处理,用队列。
这里的 是已存元素数,移动一个槽位或沿一条链接访问的成本视为常数。摊销成本约束的是一整串操作,包括偶尔发生的扩缩容,不是对随机输入取平均。栈和队列两行描述接口,具体实现成本需要分别查看。这些比较针对内存中的顺序容器,不涉及并发消息投递或磁盘索引。