20182326 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

2019-2020-26 《数据结构与面向对象程序设计》第8周学习总结

教材学习内容总结

  • 链表
  1. 可用对象引用变量来创建链式结构
  2. 链表由对象组成,其中每个对象指向表中的下一个对象
  3. 链表根据需要动态变大,本质上没有容量限制
  4. 修改引用的词序对链表的维护很重要
  5. 处理链表中的第一个结点通常需要特殊处理
  6. 实现带哨兵结点或虚位结点作为第一个结点的表,可以去掉处理第一个结点这种特殊情形
  7. 保存在集合中的对象不能包含所用数据结构的任何实现细节
  8. 使用链表实现栈,有效实现了相关操作的集合的任何一种实现方案都能用来解决问题
  9. 栈的链式实现方案在链表的一端添加和删除元素
  • 查找
  1. 查找是在一组项内找到指定目标或是确定目标不存在的过程
  2. 高效的查找使得比较的次数最少
  3. Comparable接口允许多态实现算法,而不是只应用于特定的类
  • 排序
  1. 二分查找利用了查找池有序的这个特性
  2. 二分查找每次比较都排除了一半的可行候选数据
  3. 排序是按某种标准将一列数据按确定的次序重排的过程
  4. 选择排序算法反复的将一个个具体的值放到它最终的有序位置,从而完成一组值的排序
  5. 插入排序算法反复地将一个个具体的值插入到表的已有序的子表中,从而完成一组值的排序
  6. 冒泡排序算法反复的比较相邻元素,如果必要就交换它们的次序,从而完成一组值的排序
  7. 快速排序算法通过划分表,然后再递归地对两个子表进行排序,从而完成一组值的排序
  8. 归并排序算法递归地将表平分为两部分,直到每个子表中只含有一个元素,然后将这些子表归并为有序表,从而完成一组值的排序
  9. 二分查找有对数阶的复杂度,对于大的查找池来说,这非常有效率
  10. 选择排序,插入排序及冒泡排序的平均运行时间复杂度是O(n²)
  11. 快速排序的关键是选择一个好的划分元素
  12. 归并排序的最差运行时间复杂度是O(n log n)

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

  • 问题1:链表和数组的区别
  • 问题1解决方案:
  1. 区别一:物理地址存储的连续性
    数组的元素在内存中是连续存放的。
    链表的元素在内存中不一定是连续存放的,通常是不连续的。
  2. 区别二:访问速度
    数组的访问速度很快,因为数组可以根据数组可以根据下标进行快速定位。
    链表的访问速度较慢,因为链表访问元素需要移动指针。
  3. 区别三:添加、删减元素速度
    数组的元素增删速度较慢,因为需要移动大量的元素。
    链表的元素增删速度较快,因为只需要修改指针即可。
  • 问题2:什么是交换操作?

  • 问题2解决方案:交换操作是指互换数组中两个元素的位置的过程。几个排序算法中都需要交换两个元素

  • 问题3:Comparable接口对查找及排序算法的实现有何方便之处?

  • 问题3解决方案:此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
    此接口可以定义任何一个类的对象间的相对次序,根据类的特点实现相应的compareTo方法

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

  • 问题1:选择排序、冒泡排序、插入排序到底分别指什么?
  • 问题1解决方案:冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
    选择排序(Select Sorting):的基本思想是:第一次从R[0]R[n-1]中选取最小值,与R[0]交换,第二次从R{1}R[n-1]中选取最小值,与R[1]交换,...., 第i次从R[i-1]R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列.
    插入排序(Insertion Sorting):局部有序,先把第一个数据看成一个有序数组,然后把第二个数据插入到这个“有序数组”中,形成具有两个数据的有序数组,依次类推,直至最后一个数据插入到具有 N-1 个数据的有序数组中,完成排序。插入过程:获取当前数据,并标记当前数据与下标,与之前有序数据的最后一个作比较,若小于最后一个数据则将最后一个数据进行后移操作,然后再与倒数第二个数据进行比较,重复刚才的操作,若不小于则终止操作。
    三种排序的比较:其时间复杂度都是O(n^2),但是由于细节比较或是循环问题,速度上体现为:插入排序>选择排序>冒泡排序。

代码托管week13

上周考试错题总结

第八周无考试,无错题

结对及互评

点评:

  • 博客中值得学习的或问题:
    • 对课本,代码进行多方位的思考。
    • 认真寻找自己的不足之处。
    • 举例说明问题。
  • 代码中值得学习的或问题:
  • 基于评分标准,我给本博客打分:14分。得分情况如下:
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 结对学习情况真实可信的加1分
    • 正确使用Markdown语法
    • 模板中的要素齐全(加1分)
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 教材学习中的问题和解决过程, 加5分
    • 代码调试中的问题和解决过程,加2分

点评过的同学博客和代码

  • 本周结对学习情况

  • 上周博客互评情况

其他(感悟)

在java上花的时间更多了,对各种排序有了了解,正在努力记忆中

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 26/200 2/2 7/7
第二、三周 235/327 3/5 15/23
第四周 123/450 2/7 8/31
第五周 850/1300 2/9 9/40
第六周 846/1696 2/11 7/47
第七周 1614/3310 2/13 15/62
第八周 360/3670 1/14 10/72
  • 实际学习时间:10小时

参考资料

posted on 2019-11-04 20:49  20182326  阅读(163)  评论(1编辑  收藏  举报