20172305 《程序设计与数据结构》第十周学习总结
20172305 2017-2018-2 《程序设计与数据结构》第十周学习总结
教材学习内容总结
本周内容主要为书的13.1-13.5的内容:
-
第十三章
-
1.集合的同构和异构,集合同构意味着保存类型全部相同,集合异构意味着保存各种类型的对象。
-
2.动态数据结构和静态数据结构。
- 静态数据结构,例如数组在内存中是连续的存储区域,缺点是长度是固定的,新增或删除某一数据花费的时间比较多。优点可以直接访问各个数据,各个数据的地址都可以根据首地址得到,访问时间复杂度O(1)。
- 动态数据结构,例如链表在内存中不是连续的存储区域,每一个节点包含节点数据和下一个节点的指针。缺点是不利于节点的随机访问。访问节点花费时间比较多,为O(n)。优点是能够动态的调整容量,插入或者删除数据方便。
- 静态数据结构的特点是由系统分配固定大小的存储空间,以后在程序运行的过程中,存储空间的位置和容量都不会再改变。动态数据结构不确定总的数据存储量,而是为现有的每一个数据元素定义一个确定的初始大小的空间,若干个数据元素分配若干个同样大小的空间;当问题的数据量发生变化时,数据的存储空间的大小也发生变化。
-
3.线性数据结构和非线性数据结构。线性数据结构包括队列和堆栈,非线性数据结构包括树和图。
- 队列是一种以先进先出的方式管理数据的线性数据结构
- 堆栈是一种以后进后出的方式管理数据的线性数据结构
- 树是一种以层次结构组织数据的非线性数据结构
- 图是非线性数据结构,使用常见的边来连接节点
-
4.Java集合类API。集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
- 集合类型主要有3种:set(集)、list(列表)和map(映射)。
-
5.泛型,泛型对象是一种集合类对象,实现泛型对象是为了使其管理的对象的类型在某个集合类建立时也被创建,这样就允许编译时能控制一些加入到该集合中的对象的类型,减小这些对象从该集合清除时的类型转换处理。
-
教材学习中的问题和解决过程
-
问题1:队列、链表和堆栈三者的问题
-
问题1解决方案:队列和堆栈是两个类似链表的线性数据结构,但在使用时有更多的限制。对于一般的链表,可以通过链表的任意位置插入和删除节点进行修改,但是队列只能在一端加入节点(入队)(入栈),在另一端一处节点(出队)(出栈),因此队列是先进先出(FIFO)数据结构,堆栈是后进先出(LIFO)数据结构。
-
问题2的解决方案:线性结构是n个数据元素的有限序列。非线性结构是一个结点元素可能有多个直接前趋和多个直接后继。
线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构;
常用的线性结构有:线性表,栈,队列,双队列,数组,串;
非线性数据结构有:集合结构(没有对应关系)、树结构(一对多)、图结构或网结构(多对多)
-
问题3:数据结构
-
问题3的解决方案:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。数据结构是指同一数据元素类中各数据元素之间存在的关系。数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。
代码调试中的问题和解决过程
-
问题1:PP13.1和课堂实验对链表的删除和添加
-
问题1解决方案:刚学完链表的问题就在代码上进行实验,更具很蒙,就开始仿着在链表尾部进行添加的方法进行。
public void add(Magazine mag) { MagazineNode node = new MagazineNode(mag); MagazineNode current; if (list == null) list = node; else { current = list; while (current.next != null) current = current.next; current.next = node; } }
针对删除的方法,通过对链表的每一个节点进行内容的比对,不是就往下进行持续到尾部。但是我的这个删除有个缺陷,就是如果有删除的内容在链表中没有的话,没有报错的语句,不知道在哪里进行添加的。
public void delete(Magazine Node) { MagazineNode current1 = list; if(String.valueOf(current1.magazine).equals(String.valueOf(Node))) { list = current1.next; } else { while (!(String.valueOf(current1.next.magazine).equals(String.valueOf(Node)))) { current1 = current1.next; } current1.next = current1.next.next; } }
添加的方法写的相对比较完善,针对要添加的位置超出了整个链表的长度的话,会报出提醒的。正常的操作就是设置两个节点,然后在正确的位置进行加入新内容,然后把新内容的指针指向加入位置的后面链表,再在断开的位置进行指向新内容的地方。
ppublic void insert(int index, Magazine newMagazine) { MagazineNode node = new MagazineNode(newMagazine); MagazineNode current1, current2; int n = Int(list); if(index <= n + 1) { if(index == 1) { node.next = list; list = node; } else { current2 = list; current1 = list.next; for(int a = 1; a < index - 1; a++) { current2 = current2.next; current1 = current1.next; } if(current1 != null) { node.next = current1; current2.next = node; } else if(current1 == null) { current2.next = node; } } } else System.out.println("插入节点有问题!!!未进行添加!!!"); }
在这个方法里面用到了一个小方法,对链表的擦汗年高度进行判断,如果超了就会报错。PP13.1的改写则是完全抄的课堂实践进行的,很简单,完全的模仿(可能把之前的难关解决了就简单了)
-
问题2:PP13.3链表版的选择排序法
-
问题2解决方案:刚开始在这个问题上读题就产生了误区,整型数的链表就全是数么?但是这样的话,这个排序和之前的第十章的Sorting又有何区别呢?仿着那个Magazine进行编写,在做的过程中发现可以对里面的数进行比较,就仿着做一个Number类,存放数字进行比较。然后就是排完之后重新串成链表。由于里面的数是以字符串的形式保存的,还要转为数字进行比较。
Integer.parseInt(String.valueOf(min.number)) > Integer.parseInt(String.valueOf(current.number))
即进行两个数的比较。类似“三行的原则”把大小进行一个排序,但是是要接着后链表后面的东西进行。temp = min.number; min.number = numNode.number; numNode.number = temp;
- 运行效果
- 运行效果
代码托管
上周考试错题总结
- 错题1:System.err is a(n)
- A.input stream
- B.GUI dialog box that indicates when an error has arisen
- C.object
- D.Error subclass
- E.RuntimeException subclass
- 错误解析:在Java中有三个默认的流,System.in, System.out, and System.err.所有这些都是系统的对象。
- 错题2:PrintWriter is a better output stream class that PrintStream because PrintWriter
- A.has both print and println methods and PrintStream only has print
- B.can output both byte and character streams and PrintStream can only output byte streams
- C.has error checking mechanisms as part of the class and PrintStream does not
- D.will not throw checked exceptions and PrintStream will
- E.all of the above
- 错误解析:PrintWriter类是一个Writer类,而PrintStream类是一个流类。主要的区别是PrintWriter是专门为文件而设计的,因此有错误检查机制,而不是PrintStream的一部分。之前在学习IO流的时候没有关注很多,导致的错误产生。
- 错误3:All run-time Errors throw Exceptions.
- A.true
- B.false
- 错误解析:Java将任何可抛出的对象分类为错误或异常,因此没有运行时错误抛出异常。运行时错误导致程序终止。可以处理异常,以便程序继续执行(但只有在正确处理异常时)。
- 错误4:A try statement must have at least one catch statement, but could have many catch statements, and may or may not have a finally clause.
- A.true
- B.false
- 错误解析:所有的try语句必须至少有一个catch语句,否则没有理由有try语句。对于可能抛出的每种类型的异常,都可以有一个catch语句。程序员可以指定尽可能多的catch语句。此外,try语句可能有一个finally子句,但不需要。
- 错误5:In order to define a keyboard input object, keyboard, you could use the instruction:
BufferedReader keyboard = new BufferedReader(System.in);- A.true
- B.false
- 错误解析:一个BufferedReader对象必须用Reader对象构建系统。System.in是一个输入流对象。为了使用上述定义,必须将BufferedReader构造函数中的对象更改为(new InputStreamReader(System.in))。一份正确声明为:
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
- 错误6:The following defines a new Exception called AnewException.
public Exception ANewException
{
public ANewException(String message)
{
super(message);
}
}
- <span style="color:green">A.true
- <span style="color:red">**B.false**
-
错误解析:定义几乎是正确的,但是它必须定义一个类,而不是一个异常。异常是一个类,而ANewException应该扩展异常。类定义的标头应该是public类的,ANewException扩展异常。
-
第十一章和第十二章的内容主要以异常和递归为主,两者相比自我感觉比较难的是异常的部分,而且还没有来得及好好看就开始考试了,好在时间无限,可以慢慢的答题,不然怕是要真的凉了。错的这几道题都是有关第十一章的内容,看来自己更应该侧重及复习第十一章的异常内容。此外,在第十二章中的递归问题可能是在理论上没有太多的内容,而完全在实践编程项目上,才会没有过多的考题,觉得这部分完全需要一个脑洞大开的思维,所以,这部分比异常更难攻克,更应该花时间去理解汉诺塔的问题...
结对与互评
点评(方艺雯)
- 博客中值得学习的或问题:
- 知识点记录的很详细,还有配图,图片都很恰到好处。
- 没有什么问题,很完美的博客。
- 代码中值得学习的或问题:
- 问题分析的很细致,很完美。
- 基于评分标准,我给本博客打分:11分。
- 得分情况如下: - 正确使用Markdown语法(加1分)
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 三个问题加3分
- 代码调试中的问题和解决过程, 二个问题加2分
- 感想,体会不假大空的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 代码规范加1分
- 有动手写新代码的加1分
点评(王禹涵)
- 博客中值得学习的或问题:
- 图片很多,很清晰的解释了问题和相关内容
- 版面较上次有很大的改变!
- 代码中值得学习的或问题:
- 代码的问题,没什么问题,希望继续保持就行。
- 基于评分标准,我给本博客打分:11分。
- 得分情况如下:
- 正确使用Markdown语法(加1分)
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 三个问题加3分
- 代码调试中的问题和解决过程, 二个问题加2分
- 感想,体会不假大空的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 代码规范加1分
- 有动手写新代码的加1分
互评对象
-
本周结对学习情况
20172304方艺雯
20172323王禹涵 -
结对学习内容:第十三章
-
1.集合的同构和异构
-
2.动态数据结构和静态数据结构
-
3.线性数据结构和非线性数据结构
-
4.Java集合类API
-
感悟
本周感觉好忙,要对四则运算的内容进行后期处理,还要学习第十三章,还要学习四个实验。对于十三章的内容,本以为很少,但是在编程链的时候遇到了很大很大的困难,书上代码看不懂,很蒙的做这课堂作业,好在思路清晰,写的代码也一次就成。但是对于next的节点问题还是不够透彻,应该在课下好好学习。其次,对于四则运算的代码,能够很完整输出计算,就像老师说的那样看到小组成功的结果,感觉很有自豪感。但是在加分项目上做的还是不够好,对于去重的问题一直没有思路就放弃了,而且想过用倒计时的问题,想去尝试,但始终没有成果,没有应用到四则运算上,还是有很多的遗憾...
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 136/136 | 1/1 | 15/15 | |
第二周 | 570/706 | 1/2 | 20/35 | |
第三周 | 613/1319 | 1/3 | 23/58 | |
第四周 | 1249/2568 | 1/5 | 30/88 | |
第五周 | 904/3472 | 1/6 | 30/118 | |
第六周 | 540/4012 | 1/7 | 30/118 | |
第七周 | 826/4838 | 1/7 | 30/178 | |
第八周 | 925/5763 | 2/9 | 45/223 | |
第九周 | 253/6016 | 2/10 | 55/278 | |
第十周 | 958/6974 | 1/11 | 55/333 |