• 作业八


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

    教材学习内容总结

    树结构

    • 1、一对多关系的复杂结构(例:家谱、单位组织结构、DNS结构、人机大战)
      IP地址可变,通过解析DNS得到新IP

    • 2、getroot();grtparent();getChildCount();getFirstChild;getNextChild();

    • 3、双亲表示法
      孩子表示法
      双亲孩子表示法(孩子兄弟表示法(仅作了解))

    • 4二叉树
      结点度数至多为2;
      有序树:子树有左右之分
      二叉树第i层最多有2^i-1个结点
      深度为k的二叉树最多有2^k-1个结点
      对于任何一颗二叉树,如果其叶结点个数为n0,度为2的节点数为n2
      则n0=n2-12
      查找

    • 线性查找:

      1、查找性能评价:平均查找长度ASL

      ASL=(求和)p(i)*c(i)

      查找第n个元素比较次数和时间乘积

    • 折半查找(必须有序)

      1、 n/2^m=1;m为查找次数0

    • 分块查找

      1、起点+该块最大值/最小值

      2、效率位于前两者之间

    • 哈希表

      1、 x%y=5,则将x放于5号位

      2、31%13=5,18%13=5

      (直接定址法:
      数字分析法
      平方取中法)自行设计
      除留余数法

      3、解决冲突方法(1)开放定址法不断+1直至找到空
      (2)再哈希(不要求掌握)(3)链地址法建立

    排序

    • 1、插入排序(例如打牌理牌过程)

      直接插入 (从后往前依次比较,设置监督哨)
      折半插入 ()
      2-路插入(两头定数分别比较插入,如果是在两端之间的数,自行设计放在前端还是后端)

      希尔排序

      冒泡排序
    • 2、交换排序
    • 3、选择排序
    • 4、基数排序
    • 5、归并排序
    • 性能评价:1时间效率2空间效率3稳定性(a数值相同且a在b前,排序后依旧a在b前)

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

    • 问题1:哨兵的设立及其作用?
    • 问题1解决方案:哨兵结点通常在排序中使用,可提高效率。设为a[0],实际上原来的栈并不代表表中的元素。使用哨兵结点,实现带哨兵结点或虚位结点作为第1个结点的表,可以去掉处理第 1 个结点这种特殊情形
    • 问题2: 对pop,push等存在以往和疑问
    • 问题2解决方案:通过仔细阅读理解老师所给ppt理解pop和push作用
    • 问题3:对字符流,字节流理解存在困难
    • 问题3解决方案:通过交流询问和查阅课本找到相关概念区别。:字符流使用了缓冲区,而字节流没有使用缓冲区。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)。

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

    • 问题1:如何判断队列是空还是满?.
    • 问题1解决方案:
    •    public T dequeue() throws EmptyCollectionException {
        T num1;
        if (front == rear && queue[front] == null)
            throw new EmptyCollectionException("Empty!!!");
        else {
            num1 = queue[front];
            queue[front] = null;
            front = (front + 1) % queue.length;
            count--;
        }
        return num1;
        }
      
    • 问题2::栈中空间不足
    • 问题2解决方案:可以利用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;
            }
        }
      
    • 问题3: 选择排序法和冒泡排序法记混
    • 问题3解决方案:选择排序法指从数组中找到最小的元素,和第一个位置的元素互换。从第二个位置开始,找到最小的元素,和第二个位置的元素互换。直到选出array.length-1个较小元素,剩下的最大的元素自动排在最后一位。冒泡排序指
      从前往后,依次比较相邻的两个数,把较大的数放到后面。一次循环,可以在当前最末尾位置得到一个当前最大值。
    • 选择排序:
    •   public class Selection {
        public static void sort(int[] arr){
        for(int i=0; i<arr.length-1; i++) {
            int minPos = i;
            for (int j = i; j < arr.length; j++) {
                if (arr[j] < arr[minPos]) {
                    minPos = j;//找出当前最小元素的位置
                }
            }
            if(arr[minPos]!=arr[i]) {
                swap(arr,minPos,i);
            }
        }
        }
        public static void swap(int[] arr,int a,int b){
            int temp = arr[a];
            arr[a] = arr[b];
            arr[b] = temp;
        }
        }
      
    • 冒泡排序:
    •   public class Bubble {
        public static void sort(int[] arr){
        int temp;
        //依次将最大的数放置到数组末尾,将第二大的数放到倒数第二位...
        for(int i = 0;i < arr.length-1;i++){
            //从前往后,比较相邻两个数,把大的放在后边.之前已放置成功的可以不再参与比较
            for(int j = 0;j < arr.length-1-i;j++){
                if(arr[j]>arr[j+1]) {
                    swap(arr,j,j+1);
                    changed = true;
                }
            }
        }
        }
        public static void swap(int []arr,int a ,int b){
        int temp=arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
        }
        }
      

    代码托管 (书中代码)[https://gitee.com/besti1823/20182302shiyanyi00/tree/master/zuoye8]

    上周考试错题总结

    • 上周未进行测试,以下为部分过去测试错题
    • Polymorphism is achieved by
      A .overloading
      B .overriding
      C .embedding
      D .abstraction
      E .encapsulation
    • 重载只是为具有不同参数列表的方法提供了替代方法。重写提供了多态性,因为根据当前被引用的对象调用相应的方法。嵌入是类中类的封闭。抽象与多态性无关。使用可见性修饰符(public、private、protected)实现封装。
    • Which statement is completely true?
      A .Java upcasts automatically, but you must explicitly downcast
      B .Java downcasts automatically, but you must explicitly upcast
      C .Java expects the user to explicitly upcast and downcast
      D .Java will both upcast and downcast automatically
      E .The rules for upcasting and downcasting depend upon whether classes are declared public, protected, or private
    • upcasting是完全安全的,它是java支持的单一继承结构的产物。相比之下,向下转换必须由程序员显式地完成。Java只在一个方向上自动进行强制转换。上下投射的规则不依赖于使用中的可见性修改器。
    • What is the efficiency of binary search?
      A .n^2
      B .n
      C .log2 n
      D .n/2
      E .none of the above
    • 使用每个比较,二进制搜索消除了剩下的数据的大约一半。此过程将继续,直到找到所需的元素或消除所有可能的数据。由于有n个数据元素,在数据量小于1个元素之前,可以将数据减半的次数为log2n。
    • A polymorphic reference can refer to different types of objects over time.随着时间的推移,多态引用可以引用不同类型的对象。这就是多态性的意义所在:后期绑定。这意味着在程序执行时,相同的名称将与不同的语义相关联。
    • A reference variable can refer to any object created from any class related to it by inheritance.这是一种用来完成多态引用的技术,它的精确解释将在执行期间发生变化,这取决于遇到变量时引用的精确对象。
    • An interface reference can refer to any object of any class that implements the interface.
    • 接口引用可以引用实现接口的任何类的任何对象。这是使用接口名称声明引用变量的多态函数之一。
    • A method's parameter can be polymorphic, giving the method flexible control of its arguments.
    • 方法的参数可以是多态的,使方法灵活地控制其参数。为了实现这一点,仅使用接口名或基类名来声明变量。然后参数是多态的,在执行期间引用类的正确实例,在执行期间访问正确的语义。
    • If class AParentClass has a protected instance data x, and AChildClass is a derived class of AParentClass, then AChildClass can access x but can not redefine x to be a different type.
    • 派生类可以重新定义父类的任何实例数据或方法。父类的版本现在是隐藏的,但是可以通过使用super来访问,如在super.x中一样。
    • Although classes can be inherited from one-another, even Abstract classes, interfaces cannot be inherited.
      A .true
      B .false
    • 接口具有普通类所具有的所有继承属性。因此,您可以创建接口继承层次结构,就像创建类继承层次结构一样。但是,您不能做的是实例化一个必须实现的接口。
    • A Java program can handle an exception in several different ways. Which of the following is not a way that a Java program could handle an exception?
      A .ignore the exception
      B .handle the exception where it arose using try and catch statements
      C .propagate the exception to another method where it can be handled
      D .throw the exception to a pre-defined Exception class to be handled
      E .all of the above are ways that a Java program could handle an exception
    • 如果代码包含在try语句中并实现了相应的catch语句,则抛出的异常要么被当前代码捕获,要么被传播到调用导致异常的方法并在相应的catch语句中捕获的方法,或者它继续通过方法传播,传播顺序与调用这些方法的顺序相反。但是,一旦达到主方法,此过程就会停止。如果没有在那里捕获,异常将导致程序终止(这将是答案A,异常被忽略)。但是,不会向异常类抛出异常。

    结对及互评

    点评:

    • 博客中值得学习的或问题:
      • 问题:排版能力仍需提高
    • 代码中值得学习的或问题:
      • 本周代码总量较上多
      • 对本周知识点进行及时复习,上课认真听讲记录
      • 代码编写时规范性有待提高
    • 基于评分标准,我给本博客打分:13分。得分情况如下:正确使用Markdown语法(加1分)模板中的要素齐全(加1分)教材学习中的问题和解决过程(加2分)代码调试中的问题和解决过程(加2分)本周有效代码超过300分行(加2分)感想,体会不假大空(加1分)进度条中记录学习时间与改进情况(加1分)结对学习情况真实可信(加1分)有动手写新代码(加1分)点评认真,能指出博客和代码中的问题的(加1分)

    点评过的同学博客和代码

    • 本周结对学习情况
    • 结对学习内容
      • 栈的pop,push,isEmpty,expandCapacity,peek
      • 利用安卓实现相关代码
        -队与栈的区别和联系
    • 上周博客互评情况

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

    平时缺少复习,对知识点记录应向其他同学学习。栈,队相关操作有待多练习,对于树结构理解不够,仍需继续学习。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 6000行 25篇 300小时
    第一周 143/143 2/2 7/7 学会对虚拟机进行基础设置,学会git程序简单使用
    第二周 388/531 3/5 10 /17 学会部分基础编码,掌握循环格式话输出等内容
    第四周 807/1338 1/6 17/34 学会运用IDEA编写和测试代码
    第五周 1289/2096 2/8 17/51 学会运用IDEA编写和测试代码
    第六周 1005/3101 2/10 19/70 学会继承封装多态
    第七周 2240/5341 2/12 15/85 学习栈,队相关操作
    第八周 404/5745 2/14 17/102 学习查找,排列相关操作

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:20小时
    • 实际学习时间:17 小时
    • 改进情况:上课开始及时记笔记,博客及时完成,对课上所讲内容有一定理解,逐步跟上进度。

    参考资料

  • 相关阅读:
    制作一个html中闪动的title 来提示消息
    Unicode与 utf8的互相转换
    程序员找女友的类
    使用php将数组转为XML
    自己动手画一个HTML5的按钮
    浏览器推通知给桌面
    如何使用定时任务
    封装之property,多态,鸭子类型,classmethod与staticmethod
    面向对象
    继承与派生
  • 原文地址:https://www.cnblogs.com/kongmencang/p/11793940.html
Copyright © 2020-2023  润新知