首页 > 其他分享 >vector | push_back()的时间复杂度

vector | push_back()的时间复杂度

时间:2023-08-08 10:46:12浏览次数:24  
标签:big 复杂度 back vector push sum

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)\)

标签:big,复杂度,back,vector,push,sum
From: https://www.cnblogs.com/C111111/p/17613553.html

相关文章

  • 【学习笔记】时空复杂度
    时空复杂度时空复杂度,即算法的时间复杂度和空间复杂度。算法复杂度是评价一种算法优劣的重要标准,可以通过它来初步判断一段代码能否被题目所接受,得到正确答案(AC)。其中,时间复杂度通常更重要,须加分析,因为传统题目的空间限制通常是足够的(如 128.00MB 或256.00MB),而时间限制却很紧......
  • 【ACM专项练习#02】输入整行字符串、输入值到vector、取输入整数的每一位
    输入整行字符串平均绩点题目描述每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。输入有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。输出每组输出结果占一行。如果输入的大......
  • vCenter 6.7添加主机报错:Unable to push CA certificates and CRLs to host
    故障现象vsan6.7集群添加主机报错:UnabletopushCAcertificatesandCRLstohost解决方法通过web登录vcenter后选择主机和集群>选中最上面的vcenter>配置>设置>高级设置>点击编辑设置中通过过滤器。搜索到vpxd.certmgmt.mode将值从默认的vmca更改为thumbprint保存。不需要重......
  • 时间复杂度如何计算?
    1.O(1)在这个案例中,println语句执行1次,return0语句执行1次,语句共执行2次。常数的时间复杂度为O(1)。intfunc1(){println("Hello,world");//执行1次return0;}2.O(n)在这个案例中,inti语句执行1次,i<n语句执行n+1次(最后1次是不符合判断),i++语句执行n次,println......
  • MobPush iOS SDK iOS实时活动
    开发工具:Xcode功能需要:SwiftUI实现UI页面,iOS16.1以上系统使用功能使用:需应用为启动状态功能说明iOS16.1系统支持实时活动功能,可以在锁定屏幕上实时获知各种事情的进展,MobPushSDKiOS4.0.3版本已完成适配,可根据文档对应使用。集成步骤添加依赖库ActivityKit.fareworkSwiftUI......
  • 解决每次git pull、git push都要输入用户名和密码问题
    本人使用ubuntu系统,使用以下命令:gitconfig--globalcredential.helperstore这会生成一个git帐号密码文件,使用以下命令查看:cat~/.git-credentials之后使用gitpull或者gitpush得在输入一次帐号和密码,后面就不用了。......
  • vector<int> locationVec; locationVec[i] 和 locationVec.at(i) 的区别
    在C++中,vector<int>是一个动态数组,可以存储整数类型的元素。locationVec是一个vector<int>类型的对象。locationVec.at(i)和locationVec[i]都用于访问locationVec中的元素,但它们有一些区别。locationVec.at(i):这是一个成员函数,用于返回locationVec中索引为i的元素的值。如果......
  • 【HMS Core】【Push Kit】每天只能收到两条推送、状态码80100018
    【问题描述1】每天只能收到2条推送消息,其余的都无法收到【解决方案】1、请是否开通了消息自分类,因为现在是有咨询营销类消息限制的。没有使用自分类权益的话默认是资讯营销类消息。https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/message-restriction-d......
  • 18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间?
    18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间?1.vector越界访问下标std::vector是C++标准库中的一种动态数组,其大小可以根据需要进行调整。当你试图访问一个不存在的元素,即访问超出其当前大小范围的索引时,将会发生越界访问。在C++中,如果你使用operator[......
  • 9.vector与list的区别与应用?怎么找某vector或者list的倒数第二个元素
    9.vector与list的区别与应用?怎么找某vector或者list的倒数第二个元素1.vector数据结构vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(......