如何实现一个变长数组?
- 支持索引与随机访问
- 分配多长的连续空间?
- 空间不够用了怎么办?
- 空间剩余很多如何回收?
参考实现: C++:vertor Java:ArrayList Python:list
简易的实现方法
- 初始是一个空数组,分配常数空间,记录实际长度(size)和容量(capacity)
- Push back : 若空间不够,重新申请2倍大小的连续空间,拷贝到新空间,释放旧空间
- Pop back:若空间利用率(size/capacity)不到 25% ,释放一半的空间
- 均摊时间复杂度为
- 在空数组中连续插入n个元素,总插入、拷贝次数为
- 一次扩容到下一次释放,至少需要再删除
次
思考:若释放空间的阈值设定为50%,会发生什么情况? 当释放空间的阈值设定为50%,当插入元素超过一半时,Push back扩容至原来的2倍,但是随之回收垃圾,使之低于一半的容量,此时就会缩容。频繁的扩缩容是很影响性能的!
