动态数组capacity为0的情况
来源:2-9 均摊复杂度和防止复杂度的震荡
qq_奔跑了丶兄弟_0
2019-07-09
波波老师好!
我觉得在2-7节中添加元素时需要对data.length为0的情况加判断并单独处理(我觉得直接capacity++就行了),而不是直接扩容resize(2 * data.length);,因为此时扩容data.length还是0。而且这样的话就不用在删除元素时判断data.length / 2 !=0了,允许数组容量为0的情况产生。
下面是我用C++的测试,针对2-7课程老师Java的写法应该也有这种情况,所以有这个疑问
2回答
-
你的实现应该是有问题的。
只要初始化数组的capacity不为零,通过扩容和缩容,capacity不可能为零。
因为在resize中,扩容容量是2*capacity,只要capacity是正数,扩容的容量一定是一个更大的正数;
而对于缩容,缩容的容量是当前的capacity / 2。我们有判断:
if(size == data.length / 4 && data.length / 2 != 0) 所以松茸的容量也不可能是0。
我使用课程的官方代码对你的测试用例进行了测试,没有问题。
在你的环境下使用官方代码进行测试,看看是不是有同样的问题?如果没有问题,请仔细调试比对自己的代码,看哪里有问题。进步就发生在这个过程哦:)
课程课程官方代码传送门:https://github.com/liuyubobobo/Play-with-Data-Structures
本小节课程官方代码传送门:https://github.com/liuyubobobo/Play-with-Data-Structures/tree/master/02-Arrays/09-Amortized-Time-Complexity/src
加油!:)
022019-07-10 -
qq_奔跑了丶兄弟_0
提问者
2019-07-10
感谢波波老师! 我一开始的表述可能有些问题,就是我的测试用例不是针对本小节的,正如老师所说,因为有if(size == data.length / 4 && data.length / 2 != 0) 的判断,缩容时容量不会为0。
我是对课程2-7的代码:https://github.com/liuyubobobo/Play-with-Data-Structures/tree/master/02-Arrays/07-Dynamic-Array/src进行的测试,在2-7代码(103行)remove方法中其实是只有if(size == data.length / 2),所以会出现缩容时容量为0的情况。 然后我安装了java环境,对2-7测试了一下,发现数组越界了,下面的回复我给下图。
第一次addFirst和第一次removeFirst之后会导致size和capacity都为0。第二次addFirst会导致数组越界。
032019-07-10
相似问题
回答 1
回答 1