• 20172332 2017-2018-2 《程序设计与数据结构》第十周学习总结


    20172332 2017-2018-2 《程序设计与数据结构》第十周学习总结

    教材学习内容总结

    • 1.集合与数据结构。
      • 同构:集合保存的类型全部相同的对象。
      • 异构:集合可以保存各种类型的对象。
      • 集合可以用各种方式实现。(集合抽象数据类型可以互换的等同概念)
    • 2.数据结构的动态表示。
      • 动态数据结构用链来实现。(其大小是在使用时动态确定的,而不是在声明时静态确定的)
      • list永远是头节点,头节点不能变,先去判断头节点是否为空,然后再用指针.next去判断下一个是否为空,再进行下一步操作。
      • 删除或者添加节点时,需要注意不要让链表断掉,所以就要注意先后的操作步骤。
      • 除了单向链表外还有双向链表,双向链表中每个节点不仅含有一个指向后一节点的引用,而且还有一个指向前一节点的引用。双向链表使得在链表节点间向前、向后访问节点更加容易,但建立和修改操作比较复杂。
      • 链表的另一种实现是在链表中增加一个头节点,头节点类与引用的Node类不是相同的类。(看图的话就感觉是把首尾相连起来了。)
      • 链表的实现有多种方案。
    • 3.线性数据结构。
      • (1)队列。
        • 类似于列表,不同之处是队列的元素存取方式有限制。(先进先出的存取方式FIFO
        • 实际的实现方法是队列的前端随着元素取出队列而移动。(说白了就是队列前端在移动而不是元素在移动。)
        • 典型的操作:①入队——在队尾添加一个元素;②出队——从队首移出一个元素;③检测空队列——如果队列为空,返回true
      • (2)堆栈。
        • 类似于队列,差别在于堆栈元素在堆栈的同一端进入和移出堆栈,最后一个进入堆栈的元素是第一个移出堆栈的元素。(先进后出的存取方式)
        • 典型的操作:①入栈——将一个元素压入栈顶;②出栈——从栈顶移出一个元素;③读栈顶——从栈顶获取元素,但并不将该元素移出栈顶;④检测空堆栈——如果堆栈为空,返回true
        • API的java.util包中的Stack类就是实现堆栈数据结构的。
        • 一个在堆栈中搜索指定对象的方法。Stack类的search方法返回一个整型数,表示所搜索的制定对象在堆栈中的位置。
        • 任何对象都可以压入堆栈,如果是基本类型的数据,则必须先用相应的包装类将数据封装为对象。
    • 4.非线性数据结构。
      • (1)树
        • 一个根节点和构成层次结构的多个节点组成。除根节点外的所有节点称为内部节点,没有子节点的节点称为叶节点。
        • 由上而下,根节点在顶层,叶节点在底层。
        • 在一棵二叉树上,每个节点不能有超过两个的子节点。从技术上说,二叉树只是普通树的子集,但是二叉树在计算领域中非常的重要,以至于人们常将二叉树本身视为一种数据结构。
        • 树和二叉树的操作有所不同,但至少两者都包括了添加节点和删除节点的操作。两者都能以引用作为动态链来很好地实现。
        • 静态表示方式实现树数据结构也是可能的。
      • (2)图
        • 图没有类似于树根节点那样的初始入口点。
        • 在一个图中,一个节点到另一个节点的连接称为边,连接一个图内各节点的边数一般没有限制。
        • 在一个普通的图中,边是双向的;在一个有向的图中,每条边只有特定的方向。
        • 与树类似,虽然也可以用数组实现图,但更常用动态链实现图。
    • 5.Java集合类API。
      • Java标准类库中定义了几种表示不同类型集合的类,常称为Java集合类API。
      • 在这组类中,大多数的类名表明了集合类型及其基本实现方法。
      • 泛型:一个集合所管理的对象的类型要在实例化该集合对象时才确定。(就可以理解为,集合本身没有类型,是在使用时才赋予的类型。)
      • 集合所能存放的对象与继承关系有关。(意思就是集合是父类的类型,但是子类也可以放进集合中。)

    教材学习中的问题和解决过程(数据结构具体的都是下学期学,现在只是简单的了解,也不知道自己哪有问题)

    代码调试中的问题和解决过程(这周的两个pp和之前的小测试非常的类似,没有什么问题)

    代码托管

    上周考试错题总结

    1.Why is the following method one which has infinite recursion?

        public int infiniteRecursion(int n)
        {
         if (n > 0) return infiniteRecursion(n) + 1;
         else return 0;
        }
    
    • A . Because there is no base case
    • B . Because the base case will never be true
    • C . Because the recursive call does not move the parameter closer to the base case
    • D . Because the recursive call moves the problem further away from the base case
    • E . None of the above, there is no infinite recursion in this method
    • 答案:C ;我选的:D
    • 分析:自身参数n递归,n无变化,肯定是无限递归。
    • 单词:1.infinite:无限。

    2.Consider the following recursive sum method:

            public int sum(int x)
            {
             if (x = = 0) return 0;
             else return sum(x - 1) + 1; 
            }
    

    If the base case is replaced with "if (x = = 1) return 1;" the method will still compute the same thing.

    • A . true
    • B . false
    • 答案:B ;我选的:A
    • 分析:如果用参数< 0调用,则原始方法会导致无限递归,但如果用任何参数>=0调用,则可以正常工作。使用新的基础情况,如果调用任何参数> 1,该方法就可以正常工作,但是如果参数< 1,则会导致无限递归。因此,和(0)现在不同于以前。(这里指的是情况相同,而并不是答案相同)
    • 单词:1.recursive:递归。

    3.It always is possible to replace a recursion by an iteration and vice versa.

    • A . true
    • B . false
    • 答案:A ;我选的:B
    • 分析:迭代和递归在计算方面是等价的,只是效率和风格等方面具有差异。
    • 单词:1.iteration:迭代。

    4.The following method correctly adds two ints, returning their sum:

            public int add(int a, int b)
            {
             return (b > 0) ? add(a+1, b-1) : a;
            }
    
    • A . true
    • B . false
    • 答案:B ;我选的:A
    • 分析:若b大于0,则该方法对;但若b小于0,则该方法不对,所以没有提前对b进行限制。
    • 单词:无

    5.The following method correctly multiplies two ints so long as both are non-negative:

            public int mpy(int a, int b)
            {
             return (b > 0) ? a + mpy(a, b-1) : 0;
            }
    
    • A . true
    • B . false
    • 答案:A ;我选的:B
    • 分析:乘法只是重复加法,所以重复的加a,b倍,就是两个数的乘积。
    • 单词:无

    点评过的同学博客和代码

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

    • 这周主要都是下学期的内容,这章就是一个导入,更何况老师上课讲了还留了一个小测试,所以没有花费很大的精力。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 182/182 1/1 10/10
    第二周 458/640 1/2 15/25
    第三周 469/1109 2/4 18/43 学会IDEA的使用和调试,学会jdb调试。
    第四周 1536/2645 1/5 24/67
    第五周 980/3625 1/6 25/92
    第六周 870/4495 1/7 16/108
    第七周 455/4950 2/9 22/130
    第八周 1322/6272 2/11 28/158
    第九周 2/13 28/186
    第十周 1/14 16/186
    • 计划学习时间:20小时

    • 实际学习时间:16小时

    • 改进情况:

    参考资料

  • 相关阅读:
    【struts1】--Servlet讲解MVC框架基本原理
    bigDecimal使用方法详解(转载)
    【web】--Ajax data选择性赋值
    【JSTL】--格式化日期--drp217
    2021-01-01:https加解密机制,你了解多少?
    2020-12-31:tcp三次握手,最后一次失败,网络会怎么样?
    2020-12-30:生产环境 CPU 占用过高,你如何解决?
    2020-12-29:mysql中,innodb表里,某一条数据删除了之后,这条数据会被真实的擦掉吗,还是删除了关系?
    2020-12-28:java中,生产环境服务器变慢,如何诊断处理?
    2020-12-27:网络调试工具都用了什么?
  • 原文地址:https://www.cnblogs.com/yu757503836/p/9061139.html
Copyright © 2020-2023  润新知