20182322 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结
教材第12章学习内容总结
- 算法:在有限步骤内求解某一问题所使用的一组定义明确的操作序列,能够在有限时间内,对一定的规范的输入获得所要求的输出。
- 渐进时间复杂度:如果 O(f(n)) 是某个算法的语句执行次数f(n)的上限,那么我们可以说此算法的渐进时间复杂度(简称时间复杂度) 或是执行时间为 O(f(n))。算法的渐进上限即为时间复杂度。
- 增长函数:表明问题的大小(n)与希望优化的值之间的关系的表达式。
- 有关算法的效率:
同一算法:取决于输入量的大小,多慢少快;
不同算法:不同的区间,算法的速度不同;规模小时,效率接近;规模大时,效率变化明显。 - 算法 = 数据结构 + 程序。
- 数据结构三要素:数据的逻辑结构、数据的存储结构和数据的运算。
教材第14章学习内容总结
一、栈
栈是一个线性集合,其元素的添加及删除都在一端进行。栈的处理数据方式为后进先出,最后入栈的元素最先移出栈,使用栈处理问题遵从反序。
二、泛型
泛型,即可以定义一个类,它保存、操作并管理直到实例化才确定类型的对象。我认为就是在一个类中利用多态技术写好各种对象,等到需要这个对象的时候在用方法调用出来。
三、链式结构
在计算机中用一组任意的存储单元存储线性表的数据元素,利用指针可以对链中的各种元素进行添加删除等操作,比较方便。
四、利用数组实现栈
首先了解数组的几个关键特性:存储在数组中的元素的下标为0到n-1,其中n是数组总的单元数。一个数组是一个对象,应该分别对其中所保存的对象进行实例化。设计栈的数组时,栈底总位于数组下标为0的位置,栈中的元素按序连续保存在数组中。在这个类中定义pop、push、peek、isEmpty等操作。
五、使用链实现栈
使用链表来实现栈,仅需要一个引用指向表的第一个结点,并了解表中的元素个数count,基于栈只允许在一端添加或删除元素这个属性,所以只需要在链表的一端进行操作。在这个类中也同样定义push、pop、peek等操作。
教材第15章学习内容总结
一、队列ADT
队列是一个线性集合,它在一端添加元素,在另一端删除元素,以先进先出的方式处理元素。
二、使用链表实现队列
实现链表的过程中,除了有一个指向链表第一个元素的引用(front)之外,还必须使用第二个引用(rear)指向表的最后一个元素,再利用一个整形变量count记录队列中的元素个数。
三、队列的实现:使用数组
将队列的一端固定在数组下标为0的地方。元素连续地保存在数组中。
教材学习中的问题和解决过程
第12章
- 问题1:教材中当处理器速度提高10倍时,算法A的复杂度是n2阶,效率提高只达到10的平方根3.16倍,这是为什么?
- 问题1解决方案:上网查阅资料总结。首先是时间复杂度的定义,如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数,T(n)称为这一算法的“时间复杂度”。现在时间复杂度为n,解决s1问题时需要用时为n,提速以后解决这个问题就需要1/10n,那么它能解决的问题就从s1变成了10s1。时间复杂度为n2时,提速10倍后解决一个问题的时间就变成了根号下n2/10,解决一个问题的时间为n/3.16,,所以提升后能解决的问题就变成了3.16s1。其他情况以此类推,A4的问题采用对数运算即可解决。
第14章
- 问题2:对于泛型的理解仍然不够
- 问题2解决方案:泛型只在编译阶段有效,泛型的好处:类型安全,通过知道使用泛型定义的变量的类型限制,编译器可以更有效地提高Java程序的类型安全。消除强制类型转换。 消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的。提高性能。泛型使用需要注意:泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。泛型的类型参数可以有多个。不能对确切的泛型类型使用instanceof操作
- 问题3:ArrayStack中代码分析中提出,不能对泛型实例化,也不能实例化泛型数组,为什么?
- 问题3解决方案:重新阅读教材中之前有关泛型的介绍,我了解到泛型的使用是为了在使用类的时候可以定义更多的对象,不过各个对象之间的类型不同,虽然都是属于同一个类,不过彼此之间相互独立,实例化泛型也没有意义。他们不过是一个占位符,允许我们定义可管理实例化时才确定类型对象的类。
第15章
- 问题4:不理解教材中对循环数组的解释
- 问题4解决方案:上网查阅资料,用循环数组实现队列时,我们将队列中从队头到队尾的元素按顺时针方向存放在循环数组中一段连续的单元中。当需要将新元素入队时,可将队尾游标Q.rear按顺时针方向移一位,并在新的队尾游标指示的单元中存入新元素。出队操作也很简单,只要将队头游标Q.front依顺时针方向移一位即可。用循环数组来实现队列可以在O(1)时间内完成Enqueue和Dequeue运算。执行一系列的入队与出队运算,将使整个队列在循环数组中按顺时针方向移动。
我们直接用队头游标Q.front指向队头元素所在的单元,用队尾游标Q.rear指向队尾元素所在的单元。另外,我们也可以用队头游标Q.front指向队头元素所在单元的前一个单元,或者用队尾游标Q.rear指向队尾元素所在单元的下一个单元的方法来表示队列在循环数组中的位置
代码调试中的问题和解决过程
- 问题1:不清楚LinkedStack中的pop方法。
T result = top.getElement();
top = top.getNext();
count-;
- 问题1解决方案:结合LinearNode代码理解,先将top中的元素获取并赋值给result,返回result,再用LinearNode中的getNext方法获取下一个元素到top中,这样实现了弹出元素的操作。
- 问题2:当程序Postfix运行的时候,输入的是String类的数据类型,怎么让让最后显示输入的为字符?
- 问题2解决方案:查阅资料,加入此段代码即可
if (expression != null && expression.matches("^[0.0-100.0]+$")) {// [0-100]没办法识别小数,[0.0-100.0]可以识别小数和整数
System.out.println("输入是数字!");
double num = Double.parseDouble(expression);
System.out.println(num);
} else {
System.out.println("输入值为字符!");
- 问题3:不清楚LinkedQueue中enqueue方法。
LinearNode<T> node = new LinearNode<T>(element);
if(count == 0)
front = node;
else
rear.setNext(node);
rear = node;
count++;
- 问题3解决方法:这段代码中,先实例化一个node对象。判断如果这个链表为空,则将node直接赋值给front。若不为空,则将rear指向node,并将node赋值给rear,因为链表加入元素加在队尾,所以需要将指针和队尾元素都进行调整。
代码托管
上周考试错题总结
- 没有考试
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
-
博客中值得学习的或问题:
- 排版工整
- 对问题都深入研究
-
代码中值得学习的或问题:
- 代码有自己的理解
- 代码排列不大美观
-
基于评分标准,我给本博客打分:9分。得分情况如下:
-
正确使用Markdown语法+1.
-
教材学习中的问题和解决过程+2.代码调试中的问题和解决过程+2.
-
感想,体会不假大空+1.
-
错题学习深入+1.
-
点评认真.课后题有验证+1.
-
进度条有记录+1.
点评过的同学博客和代码
- 结对学习情况
其他(感悟、思考等,可选)
- 这次学习内容较多,有好多东西没有理解通透,需要多敲代码来深入学习。
- 还有安卓的操作还不是很熟练,还需要花费大量时间去学习。
- 最近作业量太大了,老师上课讲的东西消化不良,所以还需努力学习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 59/200 | 2/2 | 20/20 | |
第三周 | 292/331 | 2/4 | 20/40 | |
第四周 | 677/969 | 2/6 | 20/60 | |
第五周 | 661/1265 | 2/8 | 20/80 | |
第六周 | 1299 /2554 | 2/10 | 20/100 | |
第七周 | 1500/4054 | 2/12 | 20/120 |