0 赞 0 踩
其他回答
先列算法
然后列算式每个push_back的时间是a(push_back)
//注:delta(size)是(插之后的size)-(插之前的size)
//delta(capacity)一个道理
然后算a到底是多少,分两种情况:
1是直接插,插完就跑
2是插不进去,需要更大的vector
最后我们发现a(push_back) = 3
面试官问你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条评论
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条评论
后 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 踩
登录后可回答 提交回答
关键词 :
- 上一个:性生活后同天吃了燃眉之急避孕药,试纸一道杠,血推迟了三天,会不会怀孕?
- 下一个:美国发生哪些不飞叶子不打紫水无妄帮派的rapper?
推荐资讯
点击排行