20182320《程序设计与数据结构》第七周学习总结
20182320《程序设计与数据结构》第七周学习总结
教材学习内容总结
1. 第十二章:算法分析
1.1 算法:
我认为是计算机完成一个任务所使用的计算方法。
1.2 算法效率:
我认为是在一定时间内,运用某算法来执行某任务的资源于时间的比值。
1.3 增长函数
增长函数表示了问题大小(n)与希望优化的值之间的关系。例如,洗碟子时,洗碟子的数量(n)和所用时间(t)的关系,"t=k*n"。
1.4 渐进复杂度(时间/空间复杂度)
又称为算法的阶,符号计为O(),它和增长函数有关,具体由例子解释:
注意:若计算一个算法的阶,其中涉及函数调用时,要把函数里面的调用也算上。
2. 第十四章:栈
2.1 什么是栈?
栈是一种数据结构,特点和电梯相似,元素从顶部压入栈中,先进去的元素后出来,后进去的元素先出来。
2.2 栈需具备的基本方法
#### 2.3 泛性 泛性,顾名思义,宽泛的类型。可用于声明,但不能实例化。需要在实例化的时候指定泛性引用变量的变量类型。 #### 2.4 后缀表达式 顾名思义,就是运算符放在数字后面的表达式。以下面为例: ![](https://img2018.cnblogs.com/blog/1779749/201911/1779749-20191101225433368-1491848476.png)用代码实现计算后缀表达式的思路如下:
将表达式字符串用StringTokenizer分隔,单独提取,若提出来的是数字,则压入一个栈中,若是运算符,则从数字栈中弹出两个数字,用这个运算符进行计算,结果再次压入栈中。
例如:
!
2.5 实现栈的数据结构的编程方法
(1)用链表实现
(2)用数组实现
3. 第十五章:队列
3.1 什么是队列?
队列也是一种数据结构,结构特点也能从它的命名看出,就和我们日常排队差不多,元素一个接一个往后排,轮到某个元素出队的时候就从最前面出,如下图:
!
3.2 队列需具备的基本方法
3.3 实现队列的编程方法
(1)用链表实现
(2)用数组实现
教材学习中的问题和解决过程
- 问题1:泛型T和Object类型的区别?
- 问题1解决方案:
在网上查找:
!
总的来说,Object是一个可以实例化的变量,它无论是先声明,还是先实例化,在后面都要进行强制转换才能赋给别的数据类型变量。
而T泛性则是在实例化之前就要给出确定的数据类型,所以不涉及强制转换。
- 问题2:链表和数组的优缺点?
- 问题2解决方案:
数组比链表好在:能根据下标随机读取,链表要访问一个结点需要一个个摸过去;
链表比数组好在:链表比数组节省空间,而且在面对多次循环,元素数量不确定时,链表能比数组更方便地开空间。
代码调试中的问题和解决过程
- 问题1:
在做PP14.7将前缀表达式转换成后缀表达式的时候,我想的过于复杂,甚至考虑到了运算符的优先级,但其实并没有那么麻烦。
- 问题1解决方案:
只需要运用两个栈,每个都是存放字符串型的变量。一个放整个表达式的所有元素,即数字、字符全放进去,随后开始pop,pop出数字就压入另一个栈,pop出运算符就在从另一个栈中pop出两个数字进行字符串连接,再放回放数字的栈。如此循环,不需要涉及字符串到字符型、整型的转换,也不涉及运算符优先级,就能实现前缀转后缀。
- 问题2:
在做查找及ADL作业中,在我编写用链地址法解决散列排序的冲突时,我的设置的指针始终都指向冲突点中的第一个位置,即由元素存放的位置,陷入死循环。
- 问题2解决方案:
后来发现我犯了一个逻辑性错误:
for(a!=null){
a=a.getNext();
}
a=new LinearNode();
在上面的代码中,a到最后总会指向null,而无法像我想象的那样为a的前一个结点赋上下一个指针的值。
[代码托管]
https://gitee.com/zheng_liyuan/Leon/tree/master/ArrayStack/javafoundations
https://gitee.com/zheng_liyuan/Leon/tree/master/Latter_Post
https://gitee.com/zheng_liyuan/Leon/tree/master/LinkedQueue/code
https://gitee.com/zheng_liyuan/Leon/tree/master/Queue
结对及互评
点评过的同学博客和代码
其他(感悟、思考等,可选)
首先,这周学习压力较前几周更大,花了很多时间来做实验、敲代码。时间花费过多,我认为主要原因有以下:
(1)编程逻辑不够严谨,在编程量大的时候,经常会频繁出现空指针异常的报错。
(2)程序条理不够清晰,虽然有简单的注释,但是还没能做到按照功能分块,往往贪图操作便捷,导致最后自己都看不懂自己的程序。
其次,单步调试真是个好东西,虽然有点复杂,但是还是能有效排查程序中的错误。
第三,安卓的所有布局中,原始布局最容易上手,可以随心所欲摆放组件位置。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 208/208 | 2/2 | 9/9 | |
第二周 | 258/466 | 2/4 | 15/24 | |
第三周 | 693/1159 | 2/6 | 22/46 | |
第四周 | 1383/2542 | 2/8 | 30/76 | |
第五周 | 1300/3842 | 2/10 | 22/98 | |
第六周 | 1998/5840 | 2/12 | 24/122 |