20182311 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结
正文
20182311 2019-2020-1 《数据结构与面向对象程序设计》第7周学习总结 |
教材学习内容总结
教材第12章
- 算法效率可以用问题大小(n)和及处理步骤来定义。增长函数表示问题大小与希望优化的值之间的关系,该函数表示算法的时间或空间利用率。
- 我们更关心算法的渐进复杂度,用来表示增长函数的一半特性。渐进复杂度称为算法的阶,用O表示,括号里放的是函数的主项,即增长最快的一项。
- 处理器速度和内存不能弥补算法效率的差异,所以如果算法效率不高,处理器速度的提高没有效果。
- 计算调用方法和循环的阶,分别求再相乘。
教材第14章
- 集合:收集并组织其他对象的对象,定义访问了访问及管理集合元素的方法。分为线性集合和非线性集合。集合元素之间的组织方式有加入次序和固有关系决定。
- 抽象数据类型是取值和操作都没有在语言中定义的一种数据类型。集合就是一个抽象名称。泛型是指保存、操作并管理指导实例化时才确定的类型的对象。
- 栈集合(LIFO原则,先进后厨)
- 用数组实现栈:利用数组实现栈会出现假溢出的问题,对于数组实现栈的管理容量办法可以定义一个自动扩容方法(声明一个更大数组来存放栈的值)。对数组来说,默认讲下表为0处当作栈底,需要用一个整型来标记栈顶的位置,即最后插入元素的后一位null,该整型也可用来表示栈内元素个数。
- 用链表实现栈:使用链表实现栈永远不会出现容量问题,使用一个对象变量作为指针保存头指针,否则会丢失链表。访问链表的方式只能从头指针向后遍历。
- 链表分为单向链表和双向链表,基本由一个结点类(存有指针和本身的数据)和一个链表类实现(存有头指针,含有实现结点排序,删除,插入等方法),双向链表可用于树的实现。插入和删除结点操作要注意修改引用的次序,以防数据丢失。
- 包:可以按代码功能组织为包,放在package中当作自定义类库使用。
教材第15章
- 队列(queue):同样是线性结构,FIFO先进先出,含有入队、出队、取头、判断、和计数的方法。
- 使用循环队列为凯撒加密使用重复编码k值提供良好方式。
- 循环队列的实现:使用数组实现队列时把数组看成一个环,避免移动元素造成的空间浪费。对指针求模,实现下标的改变,再使用计数判断队列是否满或空,执行自动扩容等操作。使用链表实现队列与实现栈类似
教材学习中的问题和解决过程
- 问题1:怎样讲前缀表达式转成后缀表达式?
- 问题1解决方案:需要用到两个栈,一个用来存运算符,一个用来存数字。先把所有字符存入栈1,再不断pop。若pop出的是数字,直接存入栈2,若pop出的是字符串,就从栈2中取出两个字符串拼接,再放回去。拼接时要注意顺序。
- 问题2:如何搭建出一个链表?怎么理清楚把方法具体放在哪个类中?
- 问题2解决方案:由点连线,先构造一个节点类,在节点中定义变量储存自身元素和指向下一个链表的地址,定义与变量有关的方法。构造一个链表类,链表定义变量储存头节点和指针等,定义与批量处理结点有关的方法。
代码调试中的问题和解决过程
-
问题1:凯撒加密的加解密错误?
-
问题1解决方案:这是一个符号打错了造成的误会。
-
问题2:定义变量对象数组后,调用对象数组单个元素出现空指针异常
-
问题2解决方法:单纯用 Student[] s=new Student()只能算声明了一个对象数组,还需要后续赋值s[i] =new Student()才算实例化成功,才能调用对象的方法。
代码托管 2
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
感悟
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 246/246 | 2/2 | 30/30 | 初步掌握linux命令、java小程序和jdb调试 |
第二周 | 73/319 | 3/3 | 30/60 | |
第三周 | 906/1225 | 3/6 | 20/80 | |
第四周 | 748/1973 | 2/8 | 20/100 | |
第五周 | 849/2822 | 2/10 | 20/120 | |
第六周 | 962/ 3784 | 2/12 | 30/150 | |
第七周 | 1883/5668 | 3/15 | 50/200 |