代码改变世界

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

2019-11-04 13:47  BBIowa  阅读(253)  评论(1编辑  收藏  举报

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

教材学习内容总结

  • 1、 查找算法的总结
    - 线性查找,通过依次遍历所要查找元素的集合,比较是否存在所需查找的元素,直到找到该元素或返回false表明集合不存在该元素。实现较为简单,但当集合元素数量巨大时,效率极慢
    -
    - 二分法查找,通过每次将集合分为两部分,比较所需查找的元素位于中间元素的左半区还是右半区,依次进行二分,直至找到元素,或返回false。效率较高,例如,一个含义一百万元素的集合,只需20次左右即可完成查找。但二分法的实现需要基于一个有序数组,否则无法实现。
  • 2、排序算法的总结
    - 顺序排序——选择排序法,选择排序法每遍历列表依次,找到当前最小元素,将其与列表左侧元素交换,最终将所有元素进行排序。
    -
    - 顺序排序——插入排序法,从最左侧元素开始,与其余元素比较,产生一个初步的排序子集,每当下一个比较的元素小于排序子集的最右元素时,经过与子集元素比较,将其插入到子集的顺序位置。子集不断向右与剩余元素进行比较,直至完成排序。
    -
    - 顺序排序——冒泡排序,将列表中的元素,从左端开始,两个元素比较大小,若左大右小,两个交换位置,一直往复,将最大元素置于最右位置。每次排序都将当前最大的交换到最右
    - 快速排序,使用递归的思想。以一个元素为界限,小在左,大在右。然后在进行递归,左右继续刚才的流程。直到完成排序。其思想与查找中的二分法类似,每次分为两部分,进行排序。从而提高效率。

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

  • 问题1:创建泛型方法与创建一个引用泛型参数的类有何区别
  • 解答:
    泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map
    一个最普通的泛型类:

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic{

//key这个成员变量的类型为T,T的类型由外部指定

private T key;

public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
    this.key = key;
}

public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
    return key;
}

}
//泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
//传入的实参类型需与泛型的类型参数类型相同,即为Integer.
Generic genericInteger = new Generic(123456);

//传入的实参类型需与泛型的类型参数类型相同,即为String.
Generic genericString = new Generic("key_vlaue");
Log.d("泛型测试","key is " + genericInteger.getKey());
Log.d("泛型测试","key is " + genericString.getKey());

  • 问题2:泛型方法

  • 问题2解决方案:

  • /*
    泛型方法的基本介绍
    传入的泛型实参
    return T 返回值为T类型
    说明:
    1)public 与 返回值中间非常重要,可以理解为声明此方法为泛型方法。
    2)只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
    3)表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
    4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。

    public T genericMethod(Class tClass)throws InstantiationException ,
    IllegalAccessException{
    T instance = tClass.newInstance();
    return instance;
    }

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

  • 问题一:构建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
第七周 9025/6000 3/4 30/50
第八周 9352/7000 1/1 30/30

参考资料