20182331 2019-2020-1《数据结构与面向对象程序设计》第7周学习总结
20182331 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结
教材学习内容总结
- 算法分析
1.增长函数:表示问题(n)大小与我们希望最优化的值之间的关系,该函数表示了该算法的时间复杂度或空间复杂度
2.在n很小时算法差别很小,但是当n很大时,增长函数之间的差别就很明显。
3.渐进复杂度称为算法的阶次(order)。
4.O()记法称为大O记法。
5.算法的阶次是忽略该算法的增长函数中的常量和其他次要项,只保留主项而得出的。
6.不管问题是大是小,运行赋值语句和if语句一次,其复杂度就为O(1)。
7.所有具有相同阶次的算法,从运行效率的角度来说都认为是等价的。
8.增长函数及其渐进复杂度
9.嵌套循环的复杂度度分析:内层循环的复杂度乘以外层循环的复杂度。
10.循环运行的复杂度分析:确定该循环体的阶次n,然后用该循环要运行的次数乘以它。循环的时间复杂度等于循环的复杂度乘以该循环的次数。
- 栈
1.栈是一种线性集合,遵循后进先出的原则。
操作 | 描述 |
---|---|
push | 添加一个元素到栈的顶部 |
pop | 从栈的顶部移除一个元素 |
peek | 查看栈顶部的元素 |
isempty | 确定栈是否为空 |
size | 确定栈的元素数目 |
3.栈的所有操作都是在一端进行的
4.类型兼容性:把一个对象赋给引用的特定赋值是否合法。类型检查:Java会自动在编译时标记出不合法的赋值。
5.可利用继承和多态来创建可以储存任意类型的对象的集合。
6.泛型:定义一个类,可以储存、操作和管理一些实例化之前没有制定类型的对象。
7.栈是计算后缀表达式的理性数据结构。
8.堆栈:堆栈是一种以后进先出方式(LIFO)管理数据的线性数据结构。
- 链表
1.对象引用变量可以用来创建链式结构。
2.在链表中储存的对象泛称为该链表的结点。
3.链表由一些对象构成,其中每个对象指向了链表中下一个对象。
4.在Java语言中,所有动态创建的对象都来自于一个名为系统堆或自由储存的内存区
5.访问元素:唯一方法是从第一个元素开始,顺着该链表往下进行。
6.插入结点: 结点可以插入到链表的前端,中间和后端,改变引用顺序是维护链表的关键。
7.删除结点:不管删除哪个结点,都要保证链表的完整性。
- 队列
1.队列是一种线性集合,其元素从一端加入,从另一端删除,按先入先出的方式处理。
2.前端(队首):front、head,末端(队尾):rear、tail,
操作 | 说明 |
---|---|
enqueue | 向队列末端添加一个元素 |
dequeue | 从队列前端删除一个元素 |
first | 考察队列前端的那一个元素 |
isEmpty | 判定队列是否为空 |
size | 判定队列中的元素数目 |
toString | 返回队列的字符串表示 |
5.Java集合API提供了Queue接口,由多个类来实现。
6.栈的首要作用是颠倒顺序,队列的首要作用是保持顺序。
- 用链表实现队列
1.指向首元素的引用head,指向链表末的引用tail,整型变量count来跟踪队列中的元素数目。
2.必须一直认真地,精准地维护特殊情况下地引用
3.对于一个空队列,head,tail引用都为null,count则为0.
4.enqueue:将当前末元素的next引用设置指向这个新元素,重新将tail设置为指向这个新添加的末元素。该操作的复杂度为O(1).
5.dequeue:先判断队列是否有元素,如果没有,抛出异常EmptyCollectionException,如果有元素,则正常删除第一个元素,如果只有唯一元素,则删除队列元素后,队列就为空,把tail引用设置为null。该操作复杂度为O(1).
6.enqueue和dequeue操作作用于队列的对立端。
- 用数组实现队列
1.由于队列操作会修改集合的两端,因此将一端固定于索引0处要求移动元素。
2.由于队列处理会影响到该集合的两端,因此从队列中删除元素的时候,该策略要求移动元素。
3.非环形数组实现的元素移位,将产生O(n)的复杂度。
4.把数组看作是环形的,可以除去在队列的数组实现中把元素移位的需要。
教材学习中的问题和解决过程
问题1:队列、链表和堆栈三者的问题
问题1解决方案:队列和堆栈是两个类似链表的线性数据结构,但在使用时有更多的限制。对于一般的链表,可以通过链表的任意位置插入和删除节点进行修改,但是队列只能在一端加入节点(入队)(入栈),在另一端一处节点(出队)(出栈),因此队列是先进先出(FIFO)数据结构,堆栈是后进先出(LIFO)数据结构。
问题2:节点是什么意思。
问题2解决方案:可以说是结构体,节点就是一个带有指针指向的结构体,把相邻的点关联起来,可以把链表想象成火车,节点就是其中一节节的车厢,通过通道和前后车厢相连。
代码调试中的问题和解决过程
问题1:在实现ArrayOrderedListTest测试时,我遇到了显示最后一个数字时显示为null。
问题1解决方案:我对前面ArrayList类检查时,发现我在显示last时,将rear-1不小心写成rear了,所以它所读取的是最后一个后边的,所以肯定为空
代码托管
上周考试错题总结
- 上周无测试
结对及互评
- 博客中值得学习的或问题:
- 学习深刻,自己有方法
- 代码中值得学习的或问题:
- 使用继承减少代码的重复编写
- 基于评分标准,我给本博客打分:8分。得分情况如下:
- 正确使用Markdown语法(加1分)
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 一个问题加1分
- 代码调试中的问题和解决过程, 一个问题加1分
- 有动手写新代码的加1分
- 结对学习情况真实可信的加1分
点评过的同学博客和代码
- 本周结对学习情况
- 20182309
- 结对学习内容
-
教材第12章、第14章和教材第15章
-
阅读课本章节内容
-
代码托管到码云上
-
完成课后自测题,并参考答案学习
-
完成课后练习题
-
完成程序设计项目,至少完成pp14.1,pp14.7,pp15.1,pp15.
-
- 结对学习内容
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 109/109 | 2/2 | 20/20 | |
第二、三周 | 729/838 | 2/4 | 47/67 | |
第四周 | 750/1588 | 2/6 | 22/89 | |
第五周 | 1588/2698 | 2/7 | 34/133 | |
第六周 | 1350/4035 | 2/9 | 24/157 | |
第九周 | 4701/7399 | 5/14 | 97/254 |