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

Posted qiuxia2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172310 2017-2018-2 《程序设计与数据结构》第十周学习总结相关的知识,希望对你有一定的参考价值。

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

教材学习内容总结

本周学习的是第十三章

  • 集合与数据结构
    • 集合是一种对象,类似于保存其他对象的存储库。我们常用集合表示一个专用于保存元素的对象,并且该对象还提供增添,删除等管理
      所保存元素的服务。
    • 集合是同构的,意味着这种集合保存类型全部相同的对象;另一些集合则是异构的,即这种集合可以保存各种类型的
      对象。
    • 分离接口与实现:
      1、一个抽象数据类型(ADT)是由数据和在该数据上所实施的具体操作构成的集合。一个ADT有名称、
      值域和一组允许执行的操作。ADT如何保存数据和执行方法的细节与其概念分离开了。实质上,“集合”和抽象数据类型”是可以互换的等同概念。
      2、对象具有定义良好的接口,从而成为一种实现集合的完善机制。
  • 数据结构的动态表示
    技术分享图片

    • 数组是表示列表的方式之一,但数组在存在期间只能有固定的大小,不是动态的。
    • 动态数据结构的大小规模随需要增长和收缩。
    • 一个动态数据结构用链来实现。
    • 通过保存和更新对象引用来实现一个链表的管理。
  • 线性数据结构
    队列和堆栈
    • 队列(queue):类似于列表,但队列元素存取方式有限制,队列采取先进先出(FIFO)的存取方式,即类似于生活中我们排队的情况,我们是从队尾入队,队首出队。
      技术分享图片

    • 堆栈(stack):堆栈类似于队列,不同之处在于元素的存取方式,它是采用后进先出(LIFO)的存取方式,也就是堆栈元素在堆栈的同一端进入和移出栈堆,最后进入的是第一个移出的。
      技术分享图片
  • 非线性数据结构
    树和图
    • 树(tree):是一个非线性数据结构,由一个节点和构感层次结构的多个节点组成(除根节点外的所有节点称为内部节点,没有子节点。
      注意,要由上至下地一棵树,根节点在顶层,叶节点在底层。
      重点概念:树是一种以层次结构组织数据的非性数据结构
    • 二叉树(binary tree)上,每个节点不能有超过两个的子节点。
      技术分享图片

    • 图(graph):图没有类似于树根节点那样的初始入口点。在一个图中,一个节点到另一个节点的连接称为边,连接一个图内各节点的边数一般没有限制。
      技术分享图片技术分享图片

数据结构_非线性结构_图

  • Java集合类API
    • Java集合类API是Java标准类库中的一组类,代表不同类型的集合体,在这组类中,大多数的类名表明了集合类型及其基本实现方法。如ArrayList和LinkedList。-
    • 泛型:Java集合类API中定义的类定义为泛型,是指一个集合所管理的对象的类型要在实例化时该集合对象时才能确定。
    • 泛型保证了集合中对象类型的兼容性。
    • 在建立集合时,如果没有指定该集合中可能存放的对象的类型,则将默认定义为Object类型,即该集合可以存放任何类型的对象。
      技术分享图片

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

  • 问题1:为什么对象特别适于实现抽象数据类型?我看到这个问题的时候觉得我可能对“对象”这个概念的理解还是不够充分。
  • 问题1解决方案:之前理解的是:类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。
    对象就是一个真实世界中的实体,对象与实体是一一对应关系的,意思就是现实世界的每一个实体都是一个对象,所以对象是一个具体的概念。
    类是对象的集合,对象是类的实例;对象是通过new className产生的,用来调用类的方法;类的构造方法 。
    这个理解是对的,但是我没有看到他背后更根本的实现的方式。
    ADT是一个包含数据和施加在这些数据类型上的操作的集合。对象实际上就是将相关变量和相关方法封装在一起的实体。对象隐藏了ADT背后的实现细节,并且将接口和底层的实现相分离,使得实现发生变化后并不影响接口。

  • 问题2:class Node { int info; Node next; }

    实例化两个Node对象,并使一个Node对象的变量next指向另一个Node对象,从而将两
    个对象链接在一起。第二个对象的引用变量next又可指向更三个Node对象,依次类推,最后建立
    起一个链表。

我以为我看懂了这句话,理解了链的结构,但是当在实现链表插入和删除方法的时候,我才发现其实自己根本就没有懂。(;′д`)ゞ
那么链表到底怎么理解呢?还有链表和LinkedList有什么关系呢?用链表来进行数据管理有什么好处呢?

  • 问题2解决方案:

    • 对于第一个问号:我再好好看了好几遍课本上的例子,觉得之前我没有理解的关键就是没有弄懂指针和next的概念。链表是相同类型的若干个结构体用其自身携带的指针(指针只是起一个指示的作用,我的理解就是表明现在的节点在什么位置,接下来的操作是在什么位置进行的)按照一定顺序串联成的一个链。举个简单例子进行类比:structnode{inta;structnode*next;};把这个链表节点的结构体structnode看作是人,结构体内的next指针看作是人的一只手,这只手只能用于指向人(别人或自己)。如果有多个人排成一排,每个人都举起右手指向右边的人,就形成一个人组成的链表。
    • LinkedList类(链接列表)
      LinkedList实现了List接口,允许null元素。但除了有List中所有方法以外,还有get,remove,insert以及最开头元素和最结尾元素等方法,而这些方法使得LinkedList既能当stack,queue和double-end queue(Deque)。
      LinkedList是将每个对象存放在独立的内存空间中,而且,每个空间中还保存有下一个链接的索引(如果是双向链表,那么它还保存了上一个链接的索引。Java是双向链表)

对顺序访问进行了优化,向List中间插入与删除得开销不大,随机访问则相对较慢(因为LinkedList是必须从头开始搜索,可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),linkedList也是不同步的。

再给大家一篇参考Linked List 链表详解

  • 链表是一种动态结构,通常是将它与静态的数组相比较

    相对于数组来说:
    优点: 通过索引(数组下标)可以很快地访问数组元素;
    缺点: 插入/删除元素需要对数组进行调整, 效率低;

而链表:
优点:插入/删除速度很快,而且不用对整个链表进行调整;
缺点:只能进行顺序访问,不能随机访问(像数组一样用下标)。

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

  • 问题1:在实现链表的删除和插入的方法时我遇到了这样一个问题,就是插入和删除后链表剩下的就只有插入的数据或是变成了空的。
    (截图被我弄丢了o(╥﹏╥)o)
  • 问题1解决方案:感谢我的队友的帮助,发现自己是因为在写红框中的循环条件的时候用的是index > 0
    (这是现在正确代码的截图)
    技术分享图片

又给了我一个小经验,一定注意循环的条件要好好设计。

  • 问题2:XXXXXX
  • 问题2解决方案:XXXXXX

代码托管

技术分享图片

上周考试错题总结

  • 错题1及原因,理解情况
    技术分享图片

如果J等于a的长度,返回false;如果j=b的长度而不等于a的长度,返回true;既不等于a的长度,又不等于b的长度,则调用递归计算(a,b,j+1)。我当时的判读是反了的,应该是只有当a的长度大于b的长度时,才会返回true。

  • 错题2及原因,理解情况
    技术分享图片

递归的情况是用相同的参数调用自己的方法,所以n不会改变,因此如果(n-0)最初是正确的,它仍然是正确的。但当n>0时,永远不可能为基本情况。逻辑我是理解的,但是给出的选项没有理解好。

  • 错题3及原因,理解情况
    技术分享图片
    A选项的意思是:当一个方法调用自己时,就会发生直接递归;间接递归发生在有干预方法的时候。
    当时没有理解什么是干预方法。
    直接递归意味着一个方法直接调用自己,而不使用中间方法。当在原始方法再次被调用之前有一个或多个中间方法时,就会发生间接递归。

这次的题目大多是考察我们能不能看懂代码的逻辑关系,所以这次花费的时间就比较长,因为要一点点理清代码一步一步要实现的事。这次容易犯错误的地方也就是因为逻辑没有理清,以后自己写代码实现递归时一定要好好设计。

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

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

xxx
xxx

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 127/127 1/1 25/25
第二周 278/405 1/2 20/45
第三周 442/847 1/3 20/65
第四周 1063/1910 2/5 30/95
第五周 840/2750 1/6 27/122
第六周 631/3381 1/7 20/142
第七周 914/4295 1/8 20/162
第八周 2534/6829 2/10 30/192
第九周 252/7081 3/13 26/218
第十周 630/7711 1/14 27/245

参考资料

以上是关于20172310 2017-2018-2 《程序设计与数据结构》第十周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第一周

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

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

2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周

20172310 2017-2018《程序设计与数据结构》(下)第四周学习总结

20172310 2017-2018《程序设计与数据结构》(下)第三周学习总结