学号 20172326 《程序设计与数据结构》第十周学习总结
教材学习内容总结
-
数据结构有多种,通过不同的数据结构可以实现不同的结构。
-
集合是一种对象,可以是同构或者异构的。
-
数据结构分为逻辑结构和物理结构。
-
逻辑结构:
-
物理结构:
顺序存储结构和链式存储结构。
顺序存储结构:在内存中开辟若干的连续空间,将每个空间存入数据,数据关联与其地址一致。比如数组。
- 结论:
顺序存储结构:
优点:
- 无需为表示表中元素之间的逻辑关系而添加空间
2. 可以快速地存取表中任意位置的元素
缺点:
- 插入和删除操作需要移动大量元素
2. 需要考虑索引越界为题
3. 扩容空间可能会造成空间浪费,缩小空间又可能会索引越界
4. null值会造成空间“碎片”
链式存储结构:每个元素只记住它下一个元素是谁(地址)。
- 链式存储结构:
优点:插入和删除操作只需改变节点next和prev成员的指向即可,无需移位,无需扩容
缺点:失去了直接存取表中任意位置元素的能力
顺序存储结构和链式存储结构的对比:
- 存储分配方式:
顺序存储结构使用一段连续的存储单元依次存储线性表元素
链式存储结构使用任意存储单元存放线性表的元素
- 时间性能:
查找:
顺序存储结构O(1)
链式存储结构O(n)
插入和删除:
顺序存储结构O(n)
链式存储结构O(1)
- 空间性能:
顺序存储结构:空间分大了浪费,分小了上溢,还得扩容
链式存储结构:有空间就能分配,元素个数不受限制
- ArrayList是顺序存储的线性表,LinkedList是链式存储的线性表,它们的特点都是有序,元素值可以重复。区别是底层算法不同。
教材学习中的问题和解决过程
-
问题1:书上说到,ArrayList不是高效的实现方案,也就不是动态的数据结构,但是明显,ArrayList是可以随用随加的,那么,二者区别到底在哪?
-
问题1理解:动态数据结构的大小规模是随需要而增长或收缩的。并不需要在声明中静态确定。换言之,arraylist是静态声明过的。但它是怎样实现的呢?这是我查到的array list的方法代码,
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1; //增加50%+1
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
可以看到,当被判定空间不足时,每次都会将容量增加至原先容量的150%。所以,arraylist自然不是动态的。而例如链结,栈之类的动态数据结构是不需要事先定义其大小的。
- 问题2:集合(Collection)类的作用
- 问题2理解:JAVA集合主要分为三种类型:Set(集),List(列表),Map(映射)。集合的主要作用是相当于一个容器,你可以在里面装你希望装的对象,可以是Java内置的类,也可以是自定义的类。再者,这些集合支持一些方便的操作,比如Set可以排除重复,Map可以快速检索。所以说,集合可以存放任何类型的对象。
代码调试中的问题和解决过程
-
问题1:PP13.3编写的问题
-
问题1解决方案:
-
可以看到,是栈溢出地问题,回到相关代码
原来是方法问题。改正即可
代码托管
上周考试错题总结
-
错题1
-
理解:这是一个递归方法,从字符串a从第一个到最后一个逐个与‘b’比较,最后返回b出现的字数
-
错题2
-
理解:如果输入大于零的数,那么将不会进入else语句,也就说一直在大于零的情况下进行递归的循环
-
错题3
-
理解:汉诺塔问题的操作数为2^n-1,所以具有指数型
-
错题4
-
理解:E选项也可以计算出结果,但是使用的时循环而不是递归
-
错题5
-
理解:如果没有基本情况,递归方法会不停地调用而无法停止,从而导致无限递归,例如错题2
-
错题6与7一起吧
-
理解:1)递归就是在过程或函数里面调用自身;
2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.
3)由于递归自动执行回溯,任何需要回溯的问题使用递归更容易解决。
-
错题8
-
理解;两种产生地条件不同
结对及互评
其他
- 这本书的学习到了尾声,很开心
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 110/110 | 1/1 | 20/20 | |
第二周 | 315/425 | 1/2 | 18/38 | |
第三周 | 475/900 | 2/4 | 22/60 | |
第四周 | 600/1500 | 1/5 | 30/90 | |
第五周 | 1215/2715 | 1/6 | 20/110 | |
第六周 | 382/3097 | 1/7 | 20/130 | |
第七周 | 721/3818 | 1/8 | 15/145 | |
第八周 | 771/4589 | 2/10 | 15/160 | |
第九周 | 311/4900 | 1/11 | 15/175 | |
第十周 | 282/5182 | 1/11 | 15/190 |