20172333 2018-2019-1 《程序设计与数据结构》第四周学习总结
Posted yanyujun527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172333 2018-2019-1 《程序设计与数据结构》第四周学习总结相关的知识,希望对你有一定的参考价值。
20172333 2018-2019-1 《程序设计与数据结构》第四周学习总结
教材学习内容总结
6.1 列表集合
- 列表集合没有内在的容量大小,随着需要而增大
- 列表集合可以在中间和末端添加和删除元素,区别于队列和栈只能在末端进行添加删除。
- 列表集合分为三类:有序列表、无序列表、索引列表
- 有序列表:其元素按照元素的内在特性排序。
- 无序列表:元素只按照它们在列表的位置进行排序。
- 索引列表:元素根据自己的数字索引进行排序。
6.4 Josephus问题
- 列表中的元素每隔i个元素进行提取,直到一个不剩,求最后一个的最初索引是多少即是Josephus问题。
在索引列表中删除了元素之后,他们的索引会自动补齐,这就是问题所在。
6 Java集合API中的列表
方法 | 功能 |
---|---|
add(E element) | 往列表末端添加一个元素 |
add(int index, E element) | 在指定索引处插入一个元素 |
get(int index) | 返回指定索引处的元素 |
remove(int index) | 删除指定索引处的元素 |
remove(o objecr) | 替代指定索引处的元素 |
set(int index, E element) | 返回列表中的元素数量 |
6 列表ADT
操作 | 功能 |
---|---|
removeFirst | 从列表中删除第一个元素 |
removeLast | 从列表中删除最后一个元素 |
remove | 从列表中删除某个元素 |
first | 查看位于列表前端的元素 |
last | 查看位于列表末端的元素 |
contains | 确定列表是否含有某个元素 |
isEmpty | 确定列表是否为空 |
size | 确定列表中的元素数量 |
6 数组实现列表
- 由于列表可以在任意位置进行元素的插入与删除,而数组实现列表的时候,元素需要进行移动。
- 在进行remove操作的时候,如果要删除的元素是列表的最后一个元素,在这种情况下,需要进行n次比较操作。事实证明,这种删除操作的实现正好需要n次比较和平移操作,因此该操作的复杂度为O(n)。如果使用的是环形数组实现,他只是提高了删除第一元素这样一种特殊情况下的性能。
- 进行contains操作时,由于该方法执行的是列表的线性查找,因此最坏的情况是所查找的元素不在列表中,在这种情况下需要n个比较操作,因而该操作的复杂度为O(n)。
6 链表实现列表
- remove操作是链表实现列表最重要的一步,该操作包括判断列表是否为空,查找删除的元素。并在四种条件下进行删除(1.被删除元素为列表中唯一元素。2.被删除元素是列表中的头元素。3.被删除元素是列表中的尾元素。4.被删除元素在列表的中部位置。)
- 虽然链表实现的列表不用进行平移元素来达到坍缩的目的,但是由于要寻找删除元素,依旧可能需要n次比较操作,所以复杂度依旧为O(n)。
教材学习中的问题和解决过程
问题1:在学习书本上时,看到这么一句话
- 索引列表的索引值总是连续的。如果删除了一个元素,其他元素的位置会像"坍缩"了一样以消除产生的间隙。
那么这里的坍缩是什么意思,指着的是后面的元素会直接消失不见,还是自动补齐呢?
问题1解决方案:百度之后,大致就是后面的元素会自动的补齐索引,毕竟列表的容量是不受限的。
- 问题2:书本上关于数组实现列表remove方法里面,最后有一行 modcount++的操作,然后书上也没有具体介绍这个modcount到底是什么用。
问题2解决方案:在查阅相关资料以及源码的情况下发现这个int值是为了记录list数组变化大小的次数,如果次数出现异常,有一个关于modcount的check函数就能调用并产生异常。
图函数
图源码
图预期情况
代码调试中的问题和解决过程
问题1:在进行删除方法的测试过程中,尾部删除永远删不掉东西。
错误信息1解决1:在回到删除方法的检验中发现,删除方法没有问题,就想到了是不是toString方法出现了差错,咋一看好像没啥问题,后来才发现,我把初始化str的步骤放在了循环里面,导致每一次循环都会初始化一次,这就会导致删除方法删掉初始化的那个“”。
图toString- 问题2:在列表的去尾方法的实现过程中,出现和数组相同的问题,方法使用之后删除不了末尾的元素。
解决2:刚开始的时候我直接想到toString是否犯了上一次的错误,后来看了一下没有上次的错误,就只能检查方法,由于链表删除全靠指针,我就一直在关注指针,后来研究了很久也没发现有什么问题,tail指针也是指向原列表的倒数第二个,按理说直接就会断开啊,后来询问了余坤澎后,他说他也遇到了这个问题,而且这个问题是由于我虽然将tail指向了倒数第二元素,但是倒数第二元素还是继续指向最后一个元素,相当于未脱开,要将它指向null才算完全脱离。手画图
代码托管
-图代码
上周考试错题总结
- 1.A linked implementation of a stack adds and removes elements from the _______ of the linked list.
- A .Front
- B .Rear
- C .Middle
- D .None of the above
- 答案:A。解析:栈类似于放箱子,再拿箱子时要从最上面一个拿即为front.
- 2.A polymorphic reference uses _______________, not the type of the reference, to determine which version of a method to invoke.
- A .the type of the object
- B .the type of the reference
- C .both A and B
- D .none of the above
- 答案:A。解析:多态使用时常常关注的是对象的类型而不是应用的类型。
结对及互评
基于评分标准,我给李楠的博客打分:7分。得分情况如下:
正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, (加3分)
代码调试中的问题和解决过程, 无问题
感想,体会真切的(加1分)
点评认真,能指出博客和代码中的问题的(加1分)
点评过的同学博客和代码
- 本周结对学习情况
- 20172330李楠
- 结对照片
- 结对学习内容
- 集合概述——栈
- 链式结构——栈
其他(感悟、思考等,可选)
这个国庆过的还算愉快,除了国庆第一天就享受了七个小时的实验编程以及倒数三天的Pp编程,还有我最最喜欢的博客- -,在编写pp的过程中才发现自己有好多的知识点一点也不知道,希望能够渐渐有那种得心应手的感觉吧。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 0/0 | 1/2 | 10/20 | |
第三周 | 1500/1500 | 1/3 | 10/30 | |
第四周 | 2761/4261 | 2/5 | 25/55 |
以上是关于20172333 2018-2019-1 《程序设计与数据结构》第四周学习总结的主要内容,如果未能解决你的问题,请参考以下文章
20172333 2018-2019-1 《程序设计与数据结构》第五周学习总结
# 20172333 2018-2019-1 《程序设计与数据结构》第八周学习总结
20172333 2018-2019-1 《程序设计与数据结构》第七周学习总结
20172333 2017-2018-2 《程序设计与数据结构》实验5报告