20172320 2018-2019-1 《Java程序设计》第五周学习总结

20172320 2018-2019-1 《Java程序设计》第五周学习总结

教材学习内容总结

查找

查找是一个在某个项目中寻找某一指定元素或者确定某一指定目标不存在的过程,对其进行查找的项目组有时也称为查找池
高效的查找会使该过程所做的比较操作次数最小化

1、线性查找法

  • 从表头开始依次比较,直到找到目标或确定目标不存在
  • 该方法容易理解但不是特别高效,唯一的条件是必须能够依次考察每一个元素,时间复杂度O(n)
  • 最好的情形是目标元素刚好是我们所考察的第一个项目,最坏的目标不存在,且在考察完所有元素后才能确认
    2、二分查找法
  • 二分查找从列表的中间开始查找,每次查找会删除一半的可行后选项
  • 二分查找普遍要快得多,二分查找具有一个对数算法,时间复杂度O(log2 n)
  • 二分查找对于大型查找池非常有效率
    3、比较
  • 线性查找比较简单,编程和调试比较容易,对于小型问题两者几乎没差距,随着n的变大,二分查找会比较有效率

    排序

    排序是基于某一标准,将某一个项目按照某个规定顺序排列,通常分为顺序排列(比较n^2次)和对数排列(比较nlog2n次),n较小时这两类算法之间几乎不存在实际差别
    1、选择排序,插入排序
    2、冒泡排序
  • 通过重复比较相邻元素且在必要时互换,从而完成排序。将最大值“冒泡”到最后,然后再次扫描,重复该过程,直到所有元素冒泡到正确的位置,一共进行n-1轮

    3、快速排序法
  • 将列表进行分区,然后对分区进行递归式排序。先选择一个列表元素作为分区元素,然后分割列表,使小于分区元素的元素位于该元素的左边,剩下的位于右边,最后再将该方法应用于两分区

    4、归并排序
  • 算法通过将列表递归分成两半直至每一子列表都含有一个元素,然后将这些子列表归并到一个排序顺序中
    分为分解、合并两步

教材中遇到的问题和解决过程

  • 选择排序和冒泡排序,插入排序的比较
  • 这些算法都是O(N2)的时间级别,但插入排序算法比冒泡快一倍,比选择排序略快一点
    冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N^2/2

       交换 0——N^2/2 = N^2/4

       总时间 3/4*N^2

  选择排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N^2/2

       交换 0——3(N-1)=3(N-1)/2=3/2*N

       总时间 N^2/2+3/2*N

  插入排序:第一轮最多比较一次,第二轮最多比较俩次,最后一轮比较N-1次,所以最多比较N*(N-1)/2。

       复制的次数和比较的次数大致相等,但是复制消耗的时间比交换要小.

       比较 0——N(N-1)/2=N(N-1)/4=N^2/4

       复制 0——N(N-1)/2=N(N-1)/4=N^2/4

       总时间 N^2/2
冒泡排序每次比较相邻的两个元素进行排序,而选择排序算法先并不急于调换位置,先从A[1]开始逐个检查,看哪个数最小就记下该数所在的位置P,等一躺扫描完毕,再把A[P]和A[1]对调,就把最小的放在了最前面,选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次

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

  • 问题1:pp9.3如何计算程序执行时间
  • 解决方案:找到两种,currentTimeMillisnanoTime,分别以毫秒和纳秒为单位计算,伪代码如下
long startTime=System.currentTimeMillis();   //获取开始时间
 
doSomeThing();  //测试的代码段
 
long endTime=System.currentTimeMillis(); //获取结束时间
 
System.out.println("程序运行时间: "+(end-start)+"ms");
 
//伪代码
 
long startTime=System.currentTimeMillis();   //获取开始时间
 
doSomeThing();  //测试的代码段
 
long endTime=System.currentTimeMillis(); //获取结束时间
 
System.out.println("程序运行时间: "+(end-start)+"ms");
long startTime=System.nanoTime();   //获取开始时间
 
doSomeThing();  //测试的代码段
 
long endTime=System.nanoTime(); //获取结束时间
 
System.out.println("程序运行时间: "+(end-start)+"ns");
 
//伪代码
 
long startTime=System.nanoTime();   //获取开始时间
 
doSomeThing();  //测试的代码段
 
long endTime=System.nanoTime(); //获取结束时间
 
System.out.println("程序运行时间: "+(end-start)+"ns");

错题分析

  • Interfaces allow us to make ____________ references, in which the method that is invoked is based on the particular object being referenced at the time.
    A .Polymorphic
    B .Multiple
    C .Interface
    D .None of the above
    分析:A
    接口允许我们创建多态引用,在这种情况下,被调用的方法基于当时被引用的特定对象
  • Interfaces allow us to make polymorphic references, in which the method that is invoked is based on the type of the reference variable rather than the particular object being referenced at the time.
    A .True
    B .False
    分析:B
    接口允许我们进行多态引用,在这种引用中,被调用的方法基于引用变量的类型,而不是当时引用的特定对象

    托管代码

    结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    20172327
  • 结对学习内容
    •阅读第9章节,运行教材上的代码
    •完成程序设计项目PP9.2、PP9.3
    •完成课后自测题,并参考答案学习

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/2 20/20
第二周 328/328 1/3 20/40
第三周 1597/ 1925 1/4 20/60

参考资料

猜你喜欢

转载自www.cnblogs.com/garolwz/p/9800572.html