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

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

教材学习内容总结

第六章主要研究了列表的概念以及某些管理列表的方法。html

列表集合

  • 链表与列表集合之间的差异:链表是一种实现策略,使用引用来在对象之间建立连接。
    以前的学习中就使用了链表来分别实现栈和队列集合。 列表集合是种概念性表示法,
    其思想是使事物以线性列表的方式进行组织。
    就像栈和队列同样,列表也可使用链表或数组来实现。
  • 列表集合没有内在的容量大小,它能够随着须要而增大。
  • 栈和队列都是线性结构,能够像列表那样进行思考,但其元素只能在末端添加和删除。列表集合更通常化,能够在列表的中间和末端添加和删除元素。
  • 列表集合的3种类型:
    • 有序列表(Cordered list), 其元素按照元素的某种内在特性进行排序。
    • 无序列表(unordered list),其元素间不具备内在顺序,元素按使用者所选择的任意方式排序。
    • 索引列表(indexed list), 其元素能够用数字索引来引用,维护一段连续的数字索引值。
  • 有序列表:列表基于某个关键值排序。对于任何已添加到有序表中的元素,只要给定了元素的关键值,同时列表已经
    定义了元素的全部关键值,那么它在列表中就会有一个固定的位置。
  • 无序列表:各元素的位置并不基于元素的任何内在特性。但列表中的元素还是按照特殊顺序放置着,只不过这种顺序与元素
    自己无关。列表的使用者会决定元素的顺序。图6.2是一个无序列表的概念图。一个 新元素能够置于列表的前端或者末端,或者
    被插入到列表中某个特定元素以后。
  • 索引列表:各元素间也不存在可以决定它们在列表中的顺序的内在系。列表的使用者决定了元素的顺序。不过,除此之外,其
    每一个元素都可以从一 个数字引值获得引用,该索引值从列表头开始从0连续增长直到列表末端。新的元素能够被添加到列表的任
    一位置, 包括列表的前端和末端。每自列表发生改变,索引值就相应调整以保持顺序和连续性。注意,索引列表和数组的根本区别在于:索引列表的索引值老是连续的。若是删除了或插入,其余的元素会进行位移,以消除间隙或腾出位置。

Java 集合API中的列表

  • Java集合API提供的列表类主要是支持索引列表。在必定程度上,这些类与无序列表是重叠的。
    然而,须要注意的是,Java API并无任何类能直接实现以上描述的有序列表。
    ArrayList和LinkedList都实现了java.util.List 接口。

由Java API提供的列表的示例。

  • 使用无序列表:学习计划
  • 索引列表:Josephus问题(当列表中的事件不是按照顺序取出而是每隔i个元素提取,直到结束,如何找到这些事件的顺序)

列表ADT

  • 不少常见操做能够为全部类型的列表定义。这些操做之间的差异在于如何添加元素。
  • 有一些操做对有序列表和无序列表都是通用的。有序列表与无序列表之间的差异一般主要体如今往列表添加元素上。
  • 在有序列表中,只需指定要添加的新元素。该元素在列表中的位置取决于其键值。
  • 无序列表支持add操做的3个变体。能够把元素添加到列表的前端、末端或是列表中某个已有元素的后面。

用数组实现列表

  • 基于数组实现的列表首先要把列表的一端固定在索引0处,设置一个整数变量rear表示列表中的元素数目,同时表示列表末端的下一个可用位置。
  • remove操做:在通常状况下须要进行数次比较和平移操做,当要删除的元素是列表的最后一个元素时
    须要进行n次比较和平移操做,因此其时间复杂度为O(n)。
  • contains操做:判断指定元素是否在列表中,最多当所找元素不在列表中时要遍历整个列表,
    须要进行n次比较操做,因此其时间复杂度为O(n)。
  • 有序列表的add操做
  • 无序列表的特有的addToFront和addAToRear操做和addAfter操做。addToRear时间复杂度为O(1)。

用链表实现列表

  • remove操做:链表实现的remove操做不须要平移元素,有四种状况:列表只有一个元素、删除列表的首元素、删除列表的尾元素和删除列表的中间元素。
    在其中仍然存在要进行n次比较操做的状况,所以其时间复杂度也为O(n)。

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

  • 问题1:有序列表和索引列表可不能够同时都是?
  • 问题1解决方案:能够,但没有什么意义。·前端

    若是某个列表既是有序列表,又是索引列表,那么,若是客户应用程序试图在某个索引处添加一一个元素,
    或者修改了某个索引处的元素(这样该元素就不在正确的顺序位置了),状况会怎么样?哪一个规则的优先级更高,索引位置仍是顺序?java

  • 问题2:串行化git

public class Course implements Serializableweb

代表该类能够被串行化对。Serializable接口不含有任何方法api

  • 问题2解决方案:数组

    串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或
    是以二进制方式经过网络传输。以后能够经过反串行化从这些连续的字节(byte)数据从新构建一个与原始对象状态相同的对象,
    所以在特定状况下也能够说是获得一个副本,但并非全部状况都这样。网络

    • 课本例题中save和load方法分别用来把ProgramOfStudy对象写入个文件中, 以及从文件中读取它,
      都使用一个串行化的过程,以二进制流的形式来读取和写入对象。所以,只需几行代码,就能够把对象的
      当前状态存储起来。在这里意味着,当前存储在学习计划中的全部课程,都做为对象的一部分而存储。数据结构

    • ProgramOsudy和Course类实现了Serializable 接口 。为了是某个对象能使用串行化进行在储,其类必须实现Serializable。
      在Serializable接口中没有任何方法,它只是代表,该对象能够转控为串行化表示形式。ArrayList 和LinkedList类也实现了Serializable接口。学习

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

  • 问题1:

  • 问题1解决方案:本身编写的ArrayList类是抽象的,java抽象类不能实例化。由于抽象类里有抽象的方法,
    抽象的方法里什么都有没只有一个方法,因此实例化没有任何意义 。
    最后就导入了API中的ArrayList类

  • 问题2:!(element instanceof Comparable)这行代码是神马意思?
  • 问题2解决方案:

    java 中的instanceof是一个二元操做符(运算符)运算符,因为是字母组成,因此是Java的保留关键字,可是
    和>=,<=,==属同一类,它的做用是用来判断,instanceof 左边对象是否为instanceof右边类的实例,返回一个boolean类
    型值。还能够用来判断子父类的所属关系。<

代码托管

上周考试错题总结

  • 错题1及缘由,理解状况
  • 解析:题目的意思是公共特征应尽量地位于类层次结构中的低层,尽可能减小维护工做量。可是公共特征应该是放在父类,甚至更先的类中,而这些是类层次结构中的高层,主要是没有理解好类层次结构,才致使了这个题目的错误。

  • 错题2及缘由,理解状况

  • A、B选项的意思分别是对象的类型和引用的类型。引用类型的变量只是一个普通变量,储存了引用类型的地址。
    对象的建立是直接在内存中分配一个内存。因此多态引用取决于那个引用变量而不是已经实例了的对象。

  • 错题3及缘由,理解状况

  • 多态引用能够在一段时间内引用不一样类型的对象。多态引用能够参考不一样类型的对象随着时间的推移。
    这是两种翻译,就是本身弄糊涂了,因此才选错了。

  • 错题4及缘由,理解状况

经过将接口名称用做返回类型,接口会将方法提交给实现堆栈的任何特定类的使用。

结对及互评

点评:

  • 博客中值得学习的或问题:
    • 博客中教材总结详细,代码段都使用了链接的方式,使版面更加的整洁。
    • 对课本中的代码都有仔细地去理解思考。
  • 代码中值得学习的或问题:
    • 代码中的结果出现问题时有及时地发现并进行修改。
  • 本周结对学习状况
    • 20172309

    • 结对学习内容
      • 对实验一碰见的问题进行讨论
      • 教材第六章内容的共同窗习
      • 第六章代码编写的讨论

点评过的同窗博客和代码

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

咱们的学习模式又回到了上个学期,又不断的提早在学习内容,其实课前预习是好的,可是我以为博客的提交时间能够放到这一章的课上完以后再提交,毕竟若是在上课以前咱们就把全部的问题都写好了,时间有点紧,并且若是是上完课,对本身教材问题的解答也会更加的清晰,因此我觉的能够在上一个博客完成以后放出下周学习的要求,可是deadline能够定在上完课以后的一两天,这样就不会那么紧张,也能达到预习的效果。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 326/326 1/2 18/28 学习在一点点的深刻
第三周 784/1110 1/3 25/53
第四周 2529/3638 2/5 37/90 这周编写了不少代码,代码量很大

参考资料

相关文章
相关标签/搜索