“数组是大量上层结构的底座:二分查找依赖 $O(1)$ 定位中点;二叉堆用下标算术隐式编码完全二叉树;前缀和与差分技巧在数组上完成区间统计与批量更新。矩阵与表格数据按行主序或列主序落成数组,图…”
“支持两种基本操作:按下标读取 $A[i]$,与按下标更新 $A[i]\leftarrow x$。作为抽象数据类型,数组只承诺这一定长索引映射的接口;连续内存是其典型实现——元素大小为 $s$…”
Dynamic array · Resizable array
以预留容量和偶发整体搬迁支持可变长度的连续序列结构。
动态数组维护长度
以容量翻倍为例,扩容时复制的元素数至多为
加上每次追加自身的一次写入,总工作量仍为线性。若支持自动收缩,收缩阈值必须低于扩张阈值,例如装载率降到
动态数组用空余空间购买增长余地。大多数追加只占用已经预留的下一个槽位,偶尔才整体搬家;昂贵搬迁不是消失了,而是由此前一长串便宜操作共同分摊。容量按常数因子增长的关键在于:每次搬迁后,新空位与已有元素同量级,所以在再次搬迁前必然发生足够多的新追加。
连续布局保留了普通数组的地址计算与缓存局部性,却也继承了它的限制。中间插入或删除会改变后缀元素的位置,通常仍需
从容量
若每次满时只把容量增加一格,第
扩容还会使指向旧存储区的地址、迭代器或引用失效;哪些引用保持有效取决于语言和容器契约。容量是实现状态,不等于可观察的逻辑长度,也不能把尚未初始化的槽位当成序列成员。
动态数组是向量、可变列表、字节缓冲区与许多哈希表桶数组的常见底层表示。它把
势能法可把空余容量或装载率偏离目标的程度编码成势,统一证明扩张与收缩的摊还界。工程实现还需考虑增长因子对空间与复制次数的取舍:因子较大减少搬迁,代价是更多闲置空间;因子接近