动态数组在某个临界点反复扩容和缩容时会不会增加系统开销?
来源: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,故应加边界控制条件避免此类情况发生。
332018-08-27
相似问题