动态数组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回答

liuyubobobo

2019-07-10

你的实现应该是有问题的。


只要初始化数组的capacity不为零,通过扩容和缩容,capacity不可能为零。

因为在resize中,扩容容量是2*capacity,只要capacity是正数,扩容的容量一定是一个更大的正数;

而对于缩容,缩容的容量是当前的capacity / 2。我们有判断:

if(size == data.length / 4 && data.length / 2 != 0) 所以松茸的容量也不可能是0。


我使用课程的官方代码对你的测试用例进行了测试,没有问题。

//img.mukewang.com/szimg/5d24c35f0001b91d11660480.jpg


在你的环境下使用官方代码进行测试,看看是不是有同样的问题?如果没有问题,请仔细调试比对自己的代码,看哪里有问题。进步就发生在这个过程哦:)


课程课程官方代码传送门: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 


加油!:)

0
2
qq_奔跑了丶兄弟_0
非常感谢!
2019-07-10
共2条回复

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测试了一下,发现数组越界了,下面的回复我给下图。

//img.mukewang.com/szimg/5d254d790001a8c809870508.jpg

//img.mukewang.com/szimg/5d254d790001472d11990955.jpg

第一次addFirst和第一次removeFirst之后会导致size和capacity都为0。第二次addFirst会导致数组越界。


0
3
liuyubobobo
回复
qq_奔跑了丶兄弟_0
看得出你的基础很好:)加油!:)
2019-07-10
共3条回复

玩转数据结构

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

6221 学习 · 1704 问题

查看课程