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

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

教材学习内容总结

本周学习的是第十三章

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

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

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

    • 图(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对象,依次类推,最后创建
    起一个链表。.net

我觉得我看懂了这句话,理解了链的结构,可是当在实现链表插入和删除方法的时候,我才发现其实本身根本就没有懂。(;´д`)ゞ
那么链表到底怎么理解呢?还有链表和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是双向链表)3d

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

再给你们一篇参考Linked List 链表详解

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

    相对于数组来讲:
    优势: 经过索引(数组下标)能够很快地访问数组元素;
    缺点: 插入/删除元素须要对数组进行调整, 效率低;

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

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

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

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

代码托管

上周考试错题总结

  • 错题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选项的意思是:当一个方法调用本身时,就会发生直接递归;间接递归发生在有干预方法的时候。
    当时没有理解什么是干预方法。
    直接递归意味着一个方法直接调用本身,而不使用中间方法。当在原始方法再次被调用以前有一个或多个中间方法时,就会发生间接递归。

此次的题目大可能是考察咱们能不能看懂代码的逻辑关系,因此此次花费的时间就比较长,由于要一点点理清代码一步一步要实现的事。此次容易犯错误的地方也就是由于逻辑没有理清,之后本身写代码实现递归时必定要好好设计。

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 本周教材的总结比较简单,可是重点都有总结到。
    • 每次博客中教材的问题都很好,值得学习。
  • 代码中值得学习的或问题:
    • 过程描述很清楚,问题也很好的解决了。
  • 参考示例

点评过的同窗博客和代码

  • 本周结对学习状况
    • 20172309

    • 结对学习内容
      • 实验三 敏捷开发与XP实践
      • 教材十三章
  • 上周博客互评状况

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

时间过得真的很快,一会儿这么厚的一本课本就翻到了最后一页。可是“学习本无底,前进莫徬徨。”
但说句实话,我对课本的掌握的仍是很差,因此我必定要好好复习,一有时间就该拿起课本看看,而不该该抱着学完就完事的想法,最后相告诉你们一句话

对世界上的一切学问与知识的掌握也并不是难事,只要锲而不舍地学习,努力掌握规律,达到熟悉的境地,就能融会贯通,运用自如了。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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

参考资料

相关文章
相关标签/搜索