20172333 2018-2019-1 《程序设计与数据结构》第四周学习总结

20172333 2018-2019-1 《程序设计与数据结构》第四周学习总结

教材学习内容总结

6.1 列表集合

  • 列表集合没有内在的容量大小,随着需要而增大
  • 列表集合可以在中间和末端添加和删除元素,区别于队列和栈只能在末端进行添加删除。
  • 列表集合分为三类:有序列表、无序列表、索引列表
  • 有序列表:其元素按照元素的内在特性排序。
  • 无序列表:元素只按照它们在列表的位置进行排序。
  • 索引列表:元素根据自己的数字索引进行排序。

6.4 Josephus问题

  • 列表中的元素每隔i个元素进行提取,直到一个不剩,求最后一个的最初索引是多少即是Josephus问题。
  • 在索引列表中删除了元素之后,他们的索引会自动补齐,这就是问题所在。

    6 Java集合API中的列表

方法 功能
add(E element) 往列表末端添加一个元素
add(int index, E element) 在指定索引处插入一个元素
get(int index) 返回指定索引处的元素
remove(int index) 删除指定索引处的元素
remove(o objecr) 替代指定索引处的元素
set(int index, E element) 返回列表中的元素数量

6 列表ADT

操作 功能
removeFirst 从列表中删除第一个元素
removeLast 从列表中删除最后一个元素
remove 从列表中删除某个元素
first 查看位于列表前端的元素
last 查看位于列表末端的元素
contains 确定列表是否含有某个元素
isEmpty 确定列表是否为空
size 确定列表中的元素数量

6 数组实现列表

  • 由于列表可以在任意位置进行元素的插入与删除,而数组实现列表的时候,元素需要进行移动。
  • 在进行remove操作的时候,如果要删除的元素是列表的最后一个元素,在这种情况下,需要进行n次比较操作。事实证明,这种删除操作的实现正好需要n次比较和平移操作,因此该操作的复杂度为O(n)。如果使用的是环形数组实现,他只是提高了删除第一元素这样一种特殊情况下的性能。
  • 进行contains操作时,由于该方法执行的是列表的线性查找,因此最坏的情况是所查找的元素不在列表中,在这种情况下需要n个比较操作,因而该操作的复杂度为O(n)。

6 链表实现列表

  • remove操作是链表实现列表最重要的一步,该操作包括判断列表是否为空,查找删除的元素。并在四种条件下进行删除(1.被删除元素为列表中唯一元素。2.被删除元素是列表中的头元素。3.被删除元素是列表中的尾元素。4.被删除元素在列表的中部位置。)
  • 虽然链表实现的列表不用进行平移元素来达到坍缩的目的,但是由于要寻找删除元素,依旧可能需要n次比较操作,所以复杂度依旧为O(n)。

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

  • 问题1:在学习书本上时,看到这么一句话

    • 索引列表的索引值总是连续的。如果删除了一个元素,其他元素的位置会像"坍缩"了一样以消除产生的间隙。
  • 那么这里的坍缩是什么意思,指着的是后面的元素会直接消失不见,还是自动补齐呢?

  • 问题1解决方案:百度之后,大致就是后面的元素会自动的补齐索引,毕竟列表的容量是不受限的。

  • 问题2:书本上关于数组实现列表remove方法里面,最后有一行 modcount++的操作,然后书上也没有具体介绍这个modcount到底是什么用。
  • 问题2解决方案:在查阅相关资料以及源码的情况下发现这个int值是为了记录list数组变化大小的次数,如果次数出现异常,有一个关于modcount的check函数就能调用并产生异常。

图函数

图源码

图预期情况

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

  • 问题1:在进行删除方法的测试过程中,尾部删除永远删不掉东西。
    错误信息1

  • 解决1:在回到删除方法的检验中发现,删除方法没有问题,就想到了是不是toString方法出现了差错,咋一看好像没啥问题,后来才发现,我把初始化str的步骤放在了循环里面,导致每一次循环都会初始化一次,这就会导致删除方法删掉初始化的那个“”。
    图toString

  • 问题2:在列表的去尾方法的实现过程中,出现和数组相同的问题,方法使用之后删除不了末尾的元素。
  • 解决2:刚开始的时候我直接想到toString是否犯了上一次的错误,后来看了一下没有上次的错误,就只能检查方法,由于链表删除全靠指针,我就一直在关注指针,后来研究了很久也没发现有什么问题,tail指针也是指向原列表的倒数第二个,按理说直接就会断开啊,后来询问了余坤澎后,他说他也遇到了这个问题,而且这个问题是由于我虽然将tail指向了倒数第二元素,但是倒数第二元素还是继续指向最后一个元素,相当于未脱开,要将它指向null才算完全脱离。手画图

代码托管

-图代码

上周考试错题总结

  • 1.A linked implementation of a stack adds and removes elements from the _______ of the linked list.
  • A .Front
  • B .Rear
  • C .Middle
  • D .None of the above
  • 答案:A。解析:栈类似于放箱子,再拿箱子时要从最上面一个拿即为front.
  • 2.A polymorphic reference uses _______________, not the type of the reference, to determine which version of a method to invoke.
  • A .the type of the object
  • B .the type of the reference
  • C .both A and B
  • D .none of the above
  • 答案:A。解析:多态使用时常常关注的是对象的类型而不是应用的类型。

结对及互评

基于评分标准,我给李楠的博客打分:7分。得分情况如下:

正确使用Markdown语法(加1分)

模板中的要素齐全(加1分)

教材学习中的问题和解决过程, (加3分)

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

感想,体会真切的(加1分)

点评认真,能指出博客和代码中的问题的(加1分)

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172330李楠
    • 结对照片
    • 结对学习内容
      • 集合概述——栈
      • 链式结构——栈

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

这个国庆过的还算愉快,除了国庆第一天就享受了七个小时的实验编程以及倒数三天的Pp编程,还有我最最喜欢的博客- -,在编写pp的过程中才发现自己有好多的知识点一点也不知道,希望能够渐渐有那种得心应手的感觉吧。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 0/0 1/2 10/20
第三周 1500/1500 1/3 10/30
第四周 2761/4261 2/5 25/55

猜你喜欢

转载自www.cnblogs.com/yanyujun527/p/9749612.html