这里解析均摊复杂度的计算过程不太对!
这里每次数组扩容,是每次扩容两倍,也就是 2n,4n,8n, 16n这种,按照上图的计算逻辑,我们假设进行4n+1次操作,实际触发了3次resize(第n+1, 2n+1,4n+1) 总共进行了 n+2n+4n+(4n+1)=11n +平均,每次就是2.75 ,而且随着次数的增加,会一直增加,复杂度符合nlogn。
28
收起
正在回答
1回答
如果做累计计算,这个上界是 3.
我们以最坏情况为例,假设执行到 2^k·n + 1 个 add 操作。那么,执行的 resize 操作数是 (n + 2n + 4n + ... + 2^k·n)
所以,总操作数是 : (n + 2n + 4n + ... + 2^k·n) + (2^k·n + 1)
这个式子的前半部分,是小于 2 * 2^k·n 的。
(1 + 2 + 4 < 8, 1 + 2 + 4 + 8 < 16,能看出来你数学底子不错,这个结论我不证明了,实际上,课程后续讲 segment tree 一类的结构时会使用这个结论,这个结论也是很多搜索算法的基础,比如迭代加深搜索。)
所以,上面这个总操作数的式子的“上界”是:2 * 2^k·n + (2^k·n + 1) = 3 * 2^k·n + 1
而我们执行了 2^k·n + 1 个 add 操作。所以 (3 * 2^k·n + 1) / (2^k·n + 1) = O(3) = O(1)
===========
调和级数和的算法可以推出一个 logn,但这里没有调和级数,而是一个几何级数。
继续加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星