ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Vector扩容倍数后的数学推导

2022-01-26 20:04:01  阅读:136  来源: 互联网

标签:扩容 vector 推导 复杂度 back 空间 Vector 倍数 push


结论1 (1-2)之间的数

首先,vector最关键在于查询,使用移位运算(2的幂)直接得到哈希链以及节点长度,然后相减直接得到键值,复杂度为O(2)
这样的话,其性能近似于数组,插入删除可动态,达到了基本目的
显然,增长的倍数不可能很大,也不会比 1 小,那么,它的最佳上限是多少呢?如果以 大于2 倍的方式扩容,下一次申请的内存会大于之前分配内存的总和,导致之前分配的内存不能再被使用。所以,最好的增长因子在 (1,2)之间为宜。

k*(2 + 2 ^ 2 + 2 ^ 3 .....+ 2 ^ n )  
= k * (  (2 ^ n+1 ) - 1) 
<=  k*(2^n+1)

为什么不是大于两倍

如果以大于2倍的方式来进行扩容,下一次申请空间会大于之前申请所有空间的总和,这样会导致之前的空间不能再被重复利用,这样是很浪费空间的操作。所以,如果扩容一般基于(1, 2] 之间进行扩容

两倍的扩容有利于时间复杂度的降低

如果已成倍方式增长。假定有 n 个元素,倍增因子为 m; 完成这 n 个元素往一个 vector 中的 push_back​操作,需要重新分配内存的次数大约为 logm(n); 第 i 次重新分配将会导致复制 m^(i) (也就是当前的vector.size() 大小)个旧空间中元素; n 次 push_back 操作所花费的时间复制度为O(n)
请添加图片描述

m / (m - 1),这是一个常量,均摊分析的方法可知,vector 中 push_back 操作的时间复杂度为常量时间.​
如果一次增加固定值大小 。假定有 n 个元素,每次增加k个;第i次增加复制的数量为为:100i ;n 次 push_back 操作所花费的时间复杂度为O(n^2):
请添加图片描述
均摊下来每次push_back 操作的时间复杂度为O(n);
总结:对比可以发现采用采用成倍方式扩容,可以保证常数的时间复杂度,而增加指定大小的容量只能达到O(n)的时间复杂度,因此,使用成倍的方式扩容为宜.

对于空间的使用

1.5倍可以重复使用之前的空间,在C++标准中,并未规定是用多少倍,是由使用者根据自己的使用情况来判断的

标签:扩容,vector,推导,复杂度,back,空间,Vector,倍数,push
来源: https://blog.csdn.net/king9666/article/details/122707713

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有