什么计算std::vector的push_back方法插入一个对象的平均日(如写出计算式)?

发布日期:2018-06-06 来源:财富国际在线 阅读:
什么计算std::vector的push_back方法插入一个对象的平均日(如写出计算式)? 匿名用户 2小时前 116 vector 如题,面试时候遇到的一个问题。
0 0
其他回答
先列算法

function push_back( E el )  if (capacity == 0) // initialize    allocate vector of length 1  else if (capacity == size) //reallocation    allocate vector of length 2 * size    copy everything from old vector    free old vector  add el to vector  // insertend


然后列算式每个push_back的时间是a(push_back)
a(push_back) = t(insert) + 2 * delta(size) - delta(capacity)

//注:delta(size)是(插之后的size)-(插之前的size)
//delta(capacity)一个道理

然后算a到底是多少,分两种情况:
1是直接插,插完就跑
2是插不进去,需要更大的vector

if push_back doesn't cause reallocation  t (insert) = 1  delta(size) = 1  delta(capacity) =0  a(push_back) = 3if push_back cause reallocation  t(insert)= n // n-1个copy + 1个insert  delta (size) = 1  delta(capacity) = (n-1)  a(push_back)= n + 2*1 - (n - 1) = 3


最后我们发现a(push_back) = 3
a(push_back) = 3 = O(1)

面试官问你2*delta(size) - delta(capacity)是怎么来的。你就告诉他是difference in potential function。以他这个智商很难跟他解释清楚…
//最好别这么说,你自己先把potential function搞明白再去面试才好

这个算的是push_back的amortized time跟average差不多一个意思。都是把total分摊到个体上的。stack overflow上有讨论amortized和average的区别的。average在push_back这个operation上没什么意义

http://stackoverflow.com/questions/7333376/difference-between-average-case-and-amortized-analysis
躺糖 1小时前 0条评论
0 0
假设现在 capacity() == size() == N ,那么
后 1/2 N 个元素拷贝了1次,是 push_back() 直接拷贝的。
前 1/2 N 个元素在上次扩容的时候多拷贝了 1 次,
前 1/4 N 个元素在上上次扩容的时候又多拷贝了 1 次,以此类推。
所以平均每个元素拷贝了 1 + 1/2 + 1/4 + ... = 2 次,这是下限。
如果这时再 push_back(),又会扩容 size = N+1 = capacity/2 + 1,这次扩容会拷贝 N 个元素,那么平均每个元素拷贝了 2+1 = 3 次,这是上限。

这是算法导论分摊分析那一章的习题。
陈硕 1小时前 0条评论
0 0

关于我们 联系我们招聘信息免责申明广告服务 网站地图 百度地图 TAG标签

Copyright@2018-2022 Cfgjzx.Com 财富国际在线 版权所有 All Rights Reserved   
财富国际提供:最新财富资讯、房产资讯、股票资讯、区块链、投资理财、保险导购、健康产品、公私募基金,易经等资讯及服务.