vector | push_back()的时间复杂度
发布日期: 2023-08-09 19:57:50 来源: 博客园

std::vector.push_back()

使用push_back()函数时,在不用扩增容量的情况下,时间复杂度是O(1);

但如果需要扩增容量,会将旧vector中所有元素复制到新的内存空间中,时间复杂度是O(n)。


(相关资料图)

假定扩增后的容量为原来的m倍

假如从一个空vevtor开始,需要插入n次元素,下面推导其时间复杂度:

对于第i次插入,其时间代价为:

\[c_i=\begin{cases}i,~i-1是m的幂\\1,~其他情况\end{cases}\]

则总代价为:

\[\sum_{i=1}^{n}c_i~=~\sum_{j=0}^km^j+\big(n-(k+1)\big),~~~~~~k = \log_mn向下取整\]

其中复制的次数为k+1(第一次插入从空vector开始也需要扩增,但不需要复制元素,复杂度为1),

\(\sum_{j=0}^km^j\) 为复制所需要的总时间代价,\(\big(n-(k+1)\big)\) 为不用复制的插入所需要的总时间代价。

有以下推导:

\[\sum_{j=0}^km^j~=~m^0+m^1+...+m^k~=~m^{k+1}-1~\leq~m^{k+1}\tag{1}\\\]\[m^{k+1}~=~m^k\cdot m\]\[m^k~=~m^{log_m~n}~=~n\tag{2}\]

即:

\[\sum_{j=0}^km^j~\leq~n\cdot m\]

又有 \(\big(n-(k+1)\big)~\leq~n\) ,所以:

\[\sum_{i=1}^{n}c_i~\leq~n~+~n\cdot m\]

即时间复杂度约为 \(O(n~+~n\cdot m)\) ,其中m为扩增容量的倍数。

所以从空vector开始使用push_back()插入若干个元素的平均时间复杂度为 \(O(m)\)

关键词:

相关文章

  • vector | push_back()的时间复杂度

  • 江西省鹰潭市龙虎山景区开展医疗器械安全科普进社区活动

  • 新一轮征地!瑞安又一批拆迁户即将出炉....

  • 录取通知书是上午到的,下午就作废了,女生哭喊:早知道不炫耀了

  • 湖南丨对恒大项目实行集中攻坚,确保房屋交付率达到90%以上

  • 武汉黄陂个人社保缴费标准_2023年黄陂五险一金最低一个月交多少钱?

  • 朔州机场完成校验飞行

  • 杨德祥 |《甜甜的苏州》(外四首)

  • 太重千吨龙门吊安装调试完成

  • 比亚迪网络举报中心:奖励9位线索提供人合计共8.7万元

  • 结构性存款收益持续下降 较普通定期存款是否还有优势?

  • Visa与富港银行合作推出跨境B2B支付解决方案

  • 国网三门峡供电公司:电网开放“零距离” 探寻“光明”奥秘

  • iphone怎么备份到icloud(iphone怎么备份)

  • 我国外汇储备规模保持基本稳定 经济长期向好基本面没有改变

  • 冯炎(Ulrich Feuereis)接任一汽-大众第一(财务)副总经理

  • 日情报专家窃听中国军队电台, 内容让专家一脸懵圈, 这是中国话吗

  • 露营,「迷失」在春风里

  • 贵州省委统战部副部长邓兆桃被查

  • 诺德基金谢屹:拾阶而上,逆风飞翔

热点图集