动态数组在某个临界点反复扩容和缩容时会不会增加系统开销?

来源:2-7 动态数组

慕先生7991853

2018-04-26

比如在视频中在10这个临界点如果增加一个元素,数组扩容为20,此时再删除一个元素,数组将缩容为10,如此反复,每次都是开辟一个新数组,并将遍历数组,会不会增加系统开销?

写回答

1回答

慕先生7991853

提问者

2018-04-26

已经在“均摊复杂度和防止复杂度震荡”中看到分析,解决方案是在缩容时使用“懒惰”策略,当原数组元素个数减为原来的1/4时,此时再进行缩容为原来的1/2,可在较大程度上避免此类情况下出现的震荡。

注意边界判断情况:以初始容量为10为例仅考虑缩容,当元素个数减为10/4=2时,容量减为10/2=5,当元素个数减为5/4=1时,容量减为5/2=2,当元素个数减为2/4=0时,此时size指向0,应减为的容量为2/2=0,在创建数组时不能创建长度为0的数组,故应在边界判断上再加上data.length/2!=0。

另外,“在创建数组时不能创建长度为0的数组”不是指的java中不能创建长度为0的数组,int[] a=new int[0];可以正常运行,只是基于此例创建长度为0的数组没意义,size无法指向,并且在扩容时0乘以任何数等于0,故应加边界控制条件避免此类情况发生。

3
3
二段媒介
data.length = 1, size = 0, 就会存在data.length / 2 = 0的情况,我的锅、
2018-08-27
共3条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程