20172332 2017-2018-2 《程序设计与数据结构》第十周学习总结
教材学习内容总结
- 1.集合与数据结构。
- 同构:集合保存的类型全部相同的对象。
- 异构:集合可以保存各种类型的对象。
- 集合可以用各种方式实现。(集合和抽象数据类型可以互换的等同概念)
- 2.数据结构的动态表示。
- 动态数据结构用链来实现。(其大小是在使用时动态确定的,而不是在声明时静态确定的)
- list永远是头节点,头节点不能变,先去判断头节点是否为空,然后再用指针.next去判断下一个是否为空,再进行下一步操作。
- 删除或者添加节点时,需要注意不要让链表断掉,所以就要注意先后的操作步骤。
- 除了单向链表外还有双向链表,双向链表中每个节点不仅含有一个指向后一节点的引用,而且还有一个指向前一节点的引用。双向链表使得在链表节点间向前、向后访问节点更加容易,但建立和修改操作比较复杂。
- 链表的另一种实现是在链表中增加一个头节点,头节点类与引用的Node类不是相同的类。(看图的话就感觉是把首尾相连起来了。)
- 链表的实现有多种方案。
- 3.线性数据结构。
- (1)队列。
- 类似于列表,不同之处是队列的元素存取方式有限制。(先进先出的存取方式FIFO)
- 实际的实现方法是队列的前端随着元素取出队列而移动。(说白了就是队列前端在移动而不是元素在移动。)
- 典型的操作:①入队——在队尾添加一个元素;②出队——从队首移出一个元素;③检测空队列——如果队列为空,返回true。
- (2)堆栈。
- 类似于队列,差别在于堆栈元素在堆栈的同一端进入和移出堆栈,最后一个进入堆栈的元素是第一个移出堆栈的元素。(先进后出的存取方式)
- 典型的操作:①入栈——将一个元素压入栈顶;②出栈——从栈顶移出一个元素;③读栈顶——从栈顶获取元素,但并不将该元素移出栈顶;④检测空堆栈——如果堆栈为空,返回true。
- API的java.util包中的Stack类就是实现堆栈数据结构的。
- 一个在堆栈中搜索指定对象的方法。Stack类的search方法返回一个整型数,表示所搜索的制定对象在堆栈中的位置。
- 任何对象都可以压入堆栈,如果是基本类型的数据,则必须先用相应的包装类将数据封装为对象。
- (1)队列。
- 4.非线性数据结构。
- (1)树
- 一个根节点和构成层次结构的多个节点组成。除根节点外的所有节点称为内部节点,没有子节点的节点称为叶节点。
- 由上而下,根节点在顶层,叶节点在底层。
- 在一棵二叉树上,每个节点不能有超过两个的子节点。从技术上说,二叉树只是普通树的子集,但是二叉树在计算领域中非常的重要,以至于人们常将二叉树本身视为一种数据结构。
- 树和二叉树的操作有所不同,但至少两者都包括了添加节点和删除节点的操作。两者都能以引用作为动态链来很好地实现。
- 静态表示方式实现树数据结构也是可能的。
- (2)图
- 图没有类似于树根节点那样的初始入口点。
- 在一个图中,一个节点到另一个节点的连接称为边,连接一个图内各节点的边数一般没有限制。
- 在一个普通的图中,边是双向的;在一个有向的图中,每条边只有特定的方向。
- 与树类似,虽然也可以用数组实现图,但更常用动态链实现图。
- (1)树
- 5.Java集合类API。
- Java标准类库中定义了几种表示不同类型集合的类,常称为Java集合类API。
- 在这组类中,大多数的类名表明了集合类型及其基本实现方法。
- 泛型:一个集合所管理的对象的类型要在实例化该集合对象时才确定。(就可以理解为,集合本身没有类型,是在使用时才赋予的类型。)
- 集合所能存放的对象与继承关系有关。(意思就是集合是父类的类型,但是子类也可以放进集合中。)
教材学习中的问题和解决过程(数据结构具体的都是下学期学,现在只是简单的了解,也不知道自己哪有问题)
代码调试中的问题和解决过程(这周的两个pp和之前的小测试非常的类似,没有什么问题)
代码托管
上周考试错题总结
1.Why is the following method one which has infinite recursion?
public int infiniteRecursion(int n)
{
if (n > 0) return infiniteRecursion(n) + 1;
else return 0;
}
- A . Because there is no base case
- B . Because the base case will never be true
- C . Because the recursive call does not move the parameter closer to the base case
- D . Because the recursive call moves the problem further away from the base case
- E . None of the above, there is no infinite recursion in this method
- 答案:C ;我选的:D
- 分析:自身参数n递归,n无变化,肯定是无限递归。
- 单词:1.infinite:无限。
2.Consider the following recursive sum method:
public int sum(int x)
{
if (x = = 0) return 0;
else return sum(x - 1) + 1;
}
If the base case is replaced with "if (x = = 1) return 1;" the method will still compute the same thing.
- A . true
- B . false
- 答案:B ;我选的:A
- 分析:如果用参数< 0调用,则原始方法会导致无限递归,但如果用任何参数>=0调用,则可以正常工作。使用新的基础情况,如果调用任何参数> 1,该方法就可以正常工作,但是如果参数< 1,则会导致无限递归。因此,和(0)现在不同于以前。(这里指的是情况相同,而并不是答案相同)
- 单词:1.recursive:递归。
3.It always is possible to replace a recursion by an iteration and vice versa.
- A . true
- B . false
- 答案:A ;我选的:B
- 分析:迭代和递归在计算方面是等价的,只是效率和风格等方面具有差异。
- 单词:1.iteration:迭代。
4.The following method correctly adds two ints, returning their sum:
public int add(int a, int b)
{
return (b > 0) ? add(a+1, b-1) : a;
}
- A . true
- B . false
- 答案:B ;我选的:A
- 分析:若b大于0,则该方法对;但若b小于0,则该方法不对,所以没有提前对b进行限制。
- 单词:无
5.The following method correctly multiplies two ints so long as both are non-negative:
public int mpy(int a, int b)
{
return (b > 0) ? a + mpy(a, b-1) : 0;
}
- A . true
- B . false
- 答案:A ;我选的:B
- 分析:乘法只是重复加法,所以重复的加a,b倍,就是两个数的乘积。
- 单词:无
点评过的同学博客和代码
其他(感悟、思考等,可选)
- 这周主要都是下学期的内容,这章就是一个导入,更何况老师上课讲了还留了一个小测试,所以没有花费很大的精力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 182/182 | 1/1 | 10/10 | |
第二周 | 458/640 | 1/2 | 15/25 | |
第三周 | 469/1109 | 2/4 | 18/43 | 学会IDEA的使用和调试,学会jdb调试。 |
第四周 | 1536/2645 | 1/5 | 24/67 | |
第五周 | 980/3625 | 1/6 | 25/92 | |
第六周 | 870/4495 | 1/7 | 16/108 | |
第七周 | 455/4950 | 2/9 | 22/130 | |
第八周 | 1322/6272 | 2/11 | 28/158 | |
第九周 | 2/13 | 28/186 | ||
第十周 | 1/14 | 16/186 |
-
计划学习时间:20小时
-
实际学习时间:16小时
-
改进情况: