很多语言的可动态变化容量的容器,其容量扩展一般是翻倍增长的策略,这里来分析一下翻倍增长策略的效率,以C++的vector容器为例。
我们不妨使用分摊复杂度分析:假设初始容量为一个常数N,连续执行n次insert()操作,最终size增长至N+n,根据算法策略,填装因子一直在(50%,100%]范围内,因此有:
size(n) ≤ capacity(n) < 2*size(n)
其中,size(n)=N+n,考虑到N为一个极小的常数,因此size(n)=O(n);再根据上面公式左边的等于号,得出:
capacity(n) = O(size(n)) = O(n)
考虑容量是按比例指数速度增长,共做过O(logn)次扩容达到capacity(n),每次扩容消耗在复制元素上的时间正比于当时的规模(size),且同样以2为比例做指数增长,因此消耗于扩容的时间累计不过:
T(n) = 2N + 4N + 8N +...+ capacity(n) <= 2*capacity(n)
以上公式是一个几何级数,其复杂度与末项同阶,即T(n) = capacity(n) = O(n)。
考虑这是操作n次insert()之后的总体时间复杂度,因此其单次操作的分摊复杂度明显是O(1)。
以上内容参考邓俊辉老师的《数据结构》,有兴趣的童鞋可自行阅读。