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

参考资料

原文地址:https://www.cnblogs.com/Qiuxia2017/p/9037932.html

时间: 2024-11-09 07:18:23

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

2017-2018-20172309 《程序设计与数据结构》第九周学习总结

2017-2018-20172309 <程序设计与数据结构>第九周学习总结 一.教材学习内容总结 一些概念: 图: 是一种复杂的非线性数据结构. 图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为: G=(V, E) 其中: V 是顶点的有穷非空集合, E 是 V 中顶点偶对(称为边)的有穷集. 通常,也将图 G 的顶点集和边集分别记为 V(G) 和 E(G) . E(G) 可以是空集.若 E(G) 为空,则图 G 只有顶点而没有边. 有向图: 若图 G中的每条边都是有方向的,则称

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

20172305 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书的第一章简单的介绍了计算机和JAVA的历史,基础内容很多,代码的讲解还没用正式进入,本周一直在做敲代码的准备,简单敲了老师给的"Hello World!"以及书后的PP1.3.PP1.4等简单的小程序. 教材学习中的问题和解决过程 问题1:三种不同类型的错误,运行错误和逻辑错误的混淆 问题1解决方案:针对EX1.20的"希望做加法时却做里乘法"进行了网上

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

20172314 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书第一章为计算机系统概述,前面是一些计算机相关的基础知识,让我对计算机有了一个总体的认识,不再是一片空白了,对主存储器和CPU影响深刻,主存储器用于保存程序和数据,CPU执行程序指令.在接下来的Java编程语言与程序开发部分,开始看的时候有点迷茫,不是很理解,后来先按照作业中附带的流程完成一些代码托管之后,接触了完整的简单的程序之后,再回过头来看书,看到的一些陌生的名词在脑海中就有了实际的对应,

20172317《程序设计与数据结构》第一周学习总结

20172317 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 重新温习了一遍计算机的基础 总算了解了局域网广域网因特网万维网这些东西之间的区别了 通过URL的例子知道了网址各个部分的含义 对Java编程语言和程序开发有了一个粗浅的了解 教材学习中的问题和解决过程 问题:练习题SR1.13出现了答案与题目不相符的情况 问题解决方案:题中有个选项是"网卡",答案中没有,反而有个题目没有的选项"调制解调器"(俗称"

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

20172322 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 了解了print与println的区别 了解了字符串的拼接可以用+来完成 了解了转义字符的使用 学会了使用赋值 学会使用部分算术运算符 学会了使用Scanner来实现交互性 教材学习中的问题和解决过程 问题1:在最初接触赋值时对foalt和double的赋值范围不了解 问题1解决方案:使用万能的度娘后看到一个高赞答案后有了了解 问题2:在提前预习时看到2.7图形后敲入的代码无法执行 问题2解决方案

20172328《程序设计与数据结构》第二周学习总结

20172328李馨雨<程序设计与数据结构>第二周学习总结 又到周五,李馨雨同学要开始写博客了.让我们开始吧!(????) 教材学习内容总结 1.首先是String类定义的字符串,然后是print和println的区别.转义字符的学习.(让我印象深刻的\b[回车符]在字符串结尾不显示哈哈,及其更新的\t[换行符],还有在课堂上真正明白了什么是回车.) 2.了解变量.常量.赋值语句.变量:保存数据的内存单元.常量:坚定自己不会变的数据!除非你用java的反射(有点复杂,改权限.去修饰符等等.没实

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

20172327 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 字符串的拼接和转义序列的使用 变量的声明和使用 讨论语法及表达式的处理 定义数据转换类型和实现类型转换的机制 创建Scanner类 教材学习中的问题和解决问题 暂无 代码学习中的问题和解决过程 问题1:在提交过程中,突然遇到无法上传的情况 问题2解决方案:通过上网查找,输入git pull之后弹出一个编辑框,选择关闭之后,再次用git push就成功了. 问题2:在按照例题2.10打代码时,Jav

学号20172328《程序设计与数据结构》第九周学习总结

学号20172328<程序设计与数据结构>第九周学习总结 教材学习内容总结(异常和递归) 第11章:异常 1.[异常处理]: 一个异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理. 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理. 2.[处理异常的三种方法]:①根本不处理异常②当异常发生时处理异常③在程序的某个位置集中处理异常. 3.[未捕获的异常]:如果程序中不处理异常,则程序将非正常的终止运行,并产生关于描述在何处发生什么异常的信息

20172326 《程序设计与数据结构》第九周学习总结

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常(exception):定义非正常情况下或错误的情况的对象,由程序或运行时环境抛出,可根据需要进行相应的捕获处理. 异常与错误的区别:错误代表不可恢复的问题并且必须捕获处理.而异常可以忽视,或者使用try语句处理,或调用更高级的方法. 可检测异常与不可检测异常:可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句中列出来.在方法定义的声明头中追加一条throws子句.不可检测异常不需要使

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

20172322 2017-2018-2 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常 学会了使用try-catch来实现未捕获的异常的处理.可以使得异常被捕获进而不导致程序出现错误退出.使用try写入可能产生异常的语句,使用catch来编写在捕获异常后继续执行的代码(可以为空). "未捕获的异常"指在编译过程中不会被编译软件显示异常但是在运行时会出现异常导致程序直接退出,例如:"ArithmeticException"."In