容器vector容量翻倍增长策略效率分析

      很多语言的可动态变化容量的容器,其容量扩展一般是翻倍增长的策略,这里来分析一下翻倍增长策略的效率,以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)

          以上公式是一个几何级数,其复杂度与末项同阶,即T(n) = capacity(n) = O(n)

          考虑这是操作n次insert()之后的总体时间复杂度,因此其单次操作的分摊复杂度明显是O(1)

          

    以上内容参考邓俊辉老师的《数据结构》,有兴趣的童鞋可自行阅读。

转载于:https://www.cnblogs.com/EasonDongH/p/10100504.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值