zoukankan      html  css  js  c++  java
  • 20182316胡泊 第8周学习总结

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

    教材学习内容总结

    查找

    • 高效的查找:比较次数越少。
    • 数组是Compareable对象,因此要实现Comparable接口,而且互相之间必须是可以比较的。
    • Comparable好处:可以比较多种类型的变量,但必须是可以比较的
    • 线性查找(比较简单就不贴代码了)
    • 二分查找
      • 前提:有序!!
      • 递归方法:
        public  boolean Search( int[] data,int min, int max, int target)
        {
          boolean found = false;
          int midpoint = (min + max) / 2;
          if (data[midpoint]==target)
              found = true;
          else if (data[midpoint]>target)
          {
              if (min <= midpoint - 1)
                  found = Search(data, min, midpoint - 1, target);
          }
          else if (midpoint + 1 <= max)
              found = Search(data,midpoint + 1, max, target);
          return found;
         }
      
      • 普通方法:
      public boolean search(int ele){
          int temp=ele;
          int low=0;
          int high=num.length-1;
          int mid=(high+low)/2;
          while(low<=high){
              if(num[mid]==temp){
                  return true;
              }
              else if(temp>num[mid]){
                  low=mid+1;
              }
              else{
                  high=mid-1;
              }
              mid=(high+low)/2;
          }
          return false;
      }
      

    排序

    • 简单选择排序(Selection sort)
      • 我的理解:首先在未排序序列中找到最小(大)元素,存放到序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到未排好序的序列的起始位置。以此类推,直到所有元素均排序完毕。、
      • 特点:相较于冒泡排序,交换次数少,但比较次数多,并且不稳定。
      • 复杂度分析
        平均时间复杂度:O(n²)
      • 代码实现
    public static void sort(int[] a) {
        for (int i = 0; i < a.length; i++) {
            int min = i;
            for (int j = i + 1; j < a.length; j++) {
                if (a[j] < a[min]) {
                    min = j;
                }
            }
            if (min != i) {
                int temp = a[i];
                a[i] = a[min];
                a[min] = temp;
            }
        }
    }
    
    • 插入排序
      • 利用插入法对无序数组排序时,我们其实是将数组划分成两个子区间:已排好序的有序区和当前未排序的部分。插入排序的基本操作是将当前无序区的第1个元素插人到有序区中适当的位置上,使有序区变为新的有序区。
      • 我的理解:这个方法感觉跟打扑克时整理手上的牌非常类似。摸来的第1张牌不需要整理,此后每次从牌堆里(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,要将摸来的牌与左手中已有的牌逐一比较。
    • 冒泡排序
      • 很常用的一种排序,这也是我接触的第一个排序算法。
      • 我的理解:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,直到没有再需要交换,也就是说该数列已经排序完成。
      • 这个方法跟快开的水一样,小气泡(较小的数)会慢慢浮到顶端。
      • 特点:交换次数过多,但是稳定。
      • 复杂度分析
        平均时间复杂度:O(n²)
      • 代码实现
    public static void sort(int[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = 0; j < a.length - i - 1; j++) {
                if (a[j] > a[j + 1]) {
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }
    
    • 归并排序
      • 归并排序算法是将几个有序列合并成一个新的有序列,即把待排序序列分为若干个小的序列,将小的序列排序,然后再把有序子序列合并并排序为为整体有序序列。
      • 复杂度分析
        平均时间复杂度:O(nlog₂n)
      • 代码实现:
      public class Merge {
      private static int[] aux;
      
      public static void sort(int[] a) {
          aux = new int[a.length];
          sort(a, 0, a.length - 1);
      }
      
      public static void sort(int[] a, int low, int high) {
          if (low >= high) {
              return;
          }
          int mid = (low + high) / 2;
          sort(a, low, mid);
          sort(a, mid + 1, high);
          merge(a, low, mid, high);
      }
      

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

    • 问题1:归并排序还是不太理解
    • 问题1解决方案:上网找了两张示意图,很清晰
      image

    image

    图解排序算法(四)之归并排序

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

    • 问题1:当我在HashLinked类里面定义一个Number型的数组
    Number[] n=new Number[20];
    

    然后在类的结构体里初始化n数组时

    public HashLinked(int[] a){
        for(int i=0;i<a.length;i++){
            n[i].num=a[i];
        }
    }
    

    每次都会报错:

    • 问题1解决方案:第一个语句只是声明了一个Number型的数组,此时数组内部都为空(NULL),所以当想要给n[i].num赋值时,就会出现空指针。于是我用了这样的一条语句:
    ele[i]=new Number(0);
    

    这样就把数组给初始化了。

    • 问题2:在我给Number型的数组赋值后,改变数组中的一个元素的值,所有元素的值都变了。

    • 问题2解决方案:其实是我一开始赋值的时候,用了
    Number I=new Number(Initial);
    for(int i=0;i<ele.length;i++){
        ele[i]=I
    }
    

    而这一步不只是赋值给他,并且是将地址都指向了I所在的位置,因此改变这个地址上的数值,数组元素都跟着变了。

    • 问题3:在计算程序运行的时间时,输出都为0ms

    • 问题3解决方法:程序简单,运行时间过短,因此无法用ms来衡量
      将得到时间的语句由
    long t1=System.currentTimeMillis();
    

    改为

    long t1=System.nanoTime();
    

    就行了。

    代码托管

    上周考试错题总结

    无考试。

    结对及互评

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

      • 对上周的错题进行了仔细的更正和课后复习,我对上周考试题的复习较为草率。
      • 博客撰写详细,有理有据。
      • 在撰写博客的过程中可以加入更多自己的理解。
    • 代码中值得学习的或问题:

      • 代码风格良好,便于阅读。
    • 基于评分标准,我给本博客打分:14分。得分情况如下:

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

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

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

    4. 代码调试中的问题和解决过程(3分)

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

    6. 其他加分:

      • 周五前发博客的加1分
      • 感想,体会不假大空的加1分
      • 进度条中记录学习时间与改进情况的加1分
      • 有动手写新代码的加1分
      • 错题学习深入的加1分
      • 点评认真,能指出博客和代码中的问题的加1分
      • 结对学习情况真实可信的加1分

    点评过的同学博客和代码

    • 本周结对学习情况
      • 结对同学学号2332

      • 结对照片

      • 结对学习内容
        对上周及本周的考试内容进行了探讨,并通过上网查询等方式深入分析,直到将问题理解。
        一起制作博客,markdown,遇到问题相互询问,并解决。

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

    第八周跟第七周博客时间几乎重了,所以没什么新的感想,那就祝学姐越来越漂亮,学长越来越帅吧(小嘴抹了蜜)。

    学习进度条

    代码行数(实际/预期) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 10000行
    第一周 119/119 3/3 20/20
    第二周 302/300 2/5 25/45
    第三周 780/800 2/7 25/70
    第四周 1500/1300 2/9 25/95
    第五周 3068/2500 3/12 25/120
    第六周 4261/4000 2/14 25/145
    第七、八周 7133/7000 3/17 25/170
    • 计划学习时间:25小时

    • 实际学习时间:20小时

    参考资料

  • 相关阅读:
    uva 532 Dungeon Master
    hrbeu 哈工程 Tunnels
    poj 1088 滑雪
    hrbeu 哈工程 Eular Graph
    uva 567 Risk
    hrbeu 哈工程 Minimum time
    产品要不要做先回答的10个问题
    用icacls命令行给目录赋权
    SQL Server的FileStream和FileTable
    cygwin 离线安装包(包括vim,ssh,scp)
  • 原文地址:https://www.cnblogs.com/hp12138/p/11790332.html
Copyright © 2011-2022 走看看