c++:vector的push_back时间复杂度分析

本文详细介绍了C++中vector的增长原理,当添加元素导致容量不足时,vector如何通过申请新空间、转移元素并释放旧空间来实现扩容。通过倍增因子,分析了push_back操作的均摊时间复杂度为O(1),并讨论了扩容过程中数据复制的均摊成本。
摘要由CSDN通过智能技术生成

vector是如何增长的:

为了支持快速随机访问,vector是连续存储的。

当添加一个新元素时,如果没有空间容纳新元素,为了保持连续存储,容器必须分配新的内存空间保存已有元素和新元素。

转移流程:申请新空间,转移元素,释放旧空间。

为了避免每次添加元素都需要转移一次空间,当需要扩容时,vector会申请一个比需求更大的内存空间,即预留一部分空间作为备用。

push_back复杂度分析:

push_back均摊后的时间复杂度为O(1)。

vector只有当达到capacity之后才会扩容。

设倍增因子为m,即达到容量上限后,新空间容量翻m倍。

现在假设要往vector丢入n个元素,

假设要扩容k次,那么有:
1 + m + m 2 + m 3 . . . + m k > = n 1+m+m^2+m^3...+m^k>=n 1+m+m2+m3...+mk>=n
根据等比数列前n项和公式,式子可以化简为:
m k − 1 > = n ∗ ( m − 1 ) m^k-1>=n*(m-1) mk1>=n(m1)
k = l o g m n ∗ ( m − 1 ) = l o g m n + l o g m ( m − 1 ) ≈ l o g m n k=log_{m}{n*(m-1)}=log_{m}n+log_{m}(m-1) \approx log_{m}n k=logmn(m1)=logmn+logm(m1)logmn
即将会进行 l o g m n 次 扩 容 操 作 log_{m}n次扩容操作 logmn

k次扩容过程中,复制数据需要的操作次数大概为:
∑ i = 1 k m i = m ∗ ( m k − 1 ) m − 1 = m ∗ ( m l o g m n − 1 ) m − 1 = m ∗ ( n − 1 ) m − 1 \sum_{i=1}^{k} m^i=\frac{m*(m^k-1)}{m-1}=\frac{m*(m^{log_{m}n}-1)}{m-1}=\frac{m*(n-1)}{m-1} i=1kmi=m1m(mk1)=m1m(mlogmn1)=m1m(n1)
均摊给n次push_back,那么:
m ∗ ( n − 1 ) m − 1 / n < m m − 1 \frac{m*(n-1)}{m-1}/n<\frac{m}{m-1} m1m(n1)/n<m1m

m m − 1 \frac{m}{m-1} m1m是常数级别的。

复制部分均摊O(1),单个元素新增O(1),因此均摊后的总复杂度为O(1)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值