代码改变世界

20182327 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

2019-11-03 16:18  BBIowa  阅读(176)  评论(1编辑  收藏  举报

20182327 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

教材学习内容总结

  • 1、算法、栈、队列
  • 2、算法优略可由增长函数判定。
  • 3、分为时间和空间,时间只看最大位。
  • 4、后缀表达式:有数字和符号计算。遇到数字将其放入栈顶。遇到符号就将栈顶- 5、两个数用符号操作。栈顶为被操作数。
  • 6、栈的类型不定可以用泛型,即不确定类型,到实例化时再确定类型。
  • 7、栈是可以通过集合实现的,top在初始化是为0,之后会变成栈顶的+1.
  • 8、ADT接口,可以通过接口来实现栈。
  • 9、栈有异常:1.入栈容量不够 2.出栈时栈空 3.扫描完栈中值多于1
  • 10、pop,peek,push等方法编写类
  • 11、队列与栈核心思想类似,是先进先出
  • 12、 查找算法的总结
    - 线性查找,通过依次遍历所要查找元素的集合,比较是否存在所需查找的元素,直到找到该元素或返回false表明集合不存在该元素。实现较为简单,但当集合元素数量巨大时,效率极慢
    -
    - 二分法查找,通过每次将集合分为两部分,比较所需查找的元素位于中间元素的左半区还是右半区,依次进行二分,直至找到元素,或返回false。效率较高,例如,一个含义一百万元素的集合,只需20次左右即可完成查找。但二分法的实现需要基于一个有序数组,否则无法实现。
  • 13、排序算法的总结
    - 顺序排序——选择排序法,选择排序法每遍历列表依次,找到当前最小元素,将其与列表左侧元素交换,最终将所有元素进行排序。
    -
    - 顺序排序——插入排序法,从最左侧元素开始,与其余元素比较,产生一个初步的排序子集,每当下一个比较的元素小于排序子集的最右元素时,经过与子集元素比较,将其插入到子集的顺序位置。子集不断向右与剩余元素进行比较,直至完成排序。
    -
    - 顺序排序——冒泡排序,将列表中的元素,从左端开始,两个元素比较大小,若左大右小,两个交换位置,一直往复,将最大元素置于最右位置。每次排序都将当前最大的交换到最右
    - 快速排序,使用递归的思想。以一个元素为界限,小在左,大在右。然后在进行递归,左右继续刚才的流程。直到完成排序。其思想与查找中的二分法类似,每次分为两部分,进行排序。从而提高效率。

教材学习中的问题和解决过程

  • 问题1:<T extends Comparable<? super T>>

  • 解答:
    首先,表示泛型参数应用于该方法,但是,泛型方法并不意味着返回一个泛型数据,而是经过编译器判断后,返回一个具体的数据类型的数据。结合起来,整体意识就为,该方法适用于继承了Comparable借口的T方法,其中该参数继承了泛型类型,但其具体数据类型不明。

  • 问题2:类的派生代表什么关系?

  • 问题2解决方案:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力,是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

代码调试中的问题和解决过程

  • 问题一:构建getRight()方法
  • 问题一解决方法:在BTNode里面就提供了getRight()方法,在这里只需要判断root是否为空就可以了

public LinkedBinaryTree getRight() {

    if (root == null)

        return null;

    else {

        LinkedBinaryTree<T> result = new LinkedBinaryTree<T>();

        result.root = root.getRight();

        return result;

    }

}
  • 问题二:类型不能转换

  • 问题二解决方法:public LinkedBinaryTree getRight() {

      if (root == null)
    
          return null;
    
      else {
    
          LinkedBinaryTree<T> result = new LinkedBinaryTree<T>();
    
          result.root = root.getRight();
    
          return result;
    
      }
    

    }

  • 问题3:如何解决空间不足的问题

  • 问题3解决方案:可以直接引用ArrayList中的expandCapacity()

private void expandCapacity() {

    T[] larger = (T[]) (new Object[tree.length * 2]);

    for (int index = 0; index < tree.length; index++)

        larger[index] = tree[index];

    tree = larger;

}

代码托管

(statistics.sh脚本的运行结果截图)

上周考试错题总结

未考试

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • 同学们已经有意识的遇见错误就截图,给后面写博客的各种方便很多,我一直忘记只能重新敲一遍。
  • 代码中值得学习的或问题:

    • 条条大路通罗马,好多同学可以曲线思维弄出代码,听他们讲解后真的很佩服。
  • 基于评分标准,我给本博客打分:11分。得分情况如下:正确使用Markdown语法+1.教材学习中的问题和解决过程+2.代码调试中的问题和解决过程+2.感想,体会不假大空+1.错题学习深入+1.点评认真,能指出博客和代码中的问题+1.结对学习情况真实可信+1.课后题有验证+1,进度条有记录+1.

  • 参考示例

点评过的同学博客和代码

  • 本周结对学习情况

  • 上周博客互评情况

其他(感悟、思考等,可选)

  • 每节课的考试让我十分吃不消,不只是英语单方面的问题,Java也有许多问题亟待解决,因为课本版本不同,找起知识点来比较麻烦。
  • 好多同学好牛,自己好菜,各种把打好的代码推翻重来,参考别人代码改来改去把自己的程序变成了四不像,运行不了,本周更加熟悉了运行一个目的堆了四五个程序的Java常态,继续虚心学习吧。
  • 实验作业越来越难,我越来越菜,随时gg。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 350/500 2/4 24/38
第三周 512/1000 3/7 22/60
第四周 1158/1300 4/9 35/90
第五周 2905/3000 6/5 24/24
第六周 3927/4000 2/2 26/30
第七周 9041/6000 3/4 30/50

参考资料