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

教材学习内容总结

第12章
算法分析

什么叫做算法:是对特定问题求解方法,或者说是步骤的一种描述。

什么叫做好算法(具有以下标准):

1.正确性

2.可读性

3.健壮性

4.通用性

5.效率与储存空间需求

冰与火之歌:【时间】与【空间】复杂度

时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。

算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐进复杂度,简称为时间复杂度。
其中f(n)是问题规模n的某个函数。这样用大写 O() 来体现算法时间复杂度的记法,我们称为大O记法

第14章

一、栈

栈是一个线性集合,其元素的添加及删除都在一端进行。栈的处理数据方式为后进先出,最后入栈的元素最先移出栈,使用栈处理问题遵从反序。

二、链式结构
在计算机中用一组任意的存储单元存储线性表的数据元素,利用指针可以对链中的各种元素进行添加删除等操作,比较方便。

三、利用数组实现栈

首先了解数组的几个关键特性:存储在数组中的元素的下标为0到n-1,其中n是数组总的单元数。一个数组是一个对象,应该分别对其中所保存的对象进行实例化。设计栈的数组时,栈底总位于数组下标为0的位置,栈中的元素按序连续保存在数组中。在这个类中定义pop、push、peek、isEmpty等操作。

四、使用链实现栈

使用链表来实现栈,仅需要一个引用指向表的第一个结点,并了解表中的元素个数count,基于栈只允许在一端添加或删除元素这个属性,所以只需要在链表的一端进行操作。在这个类中也同样定义push、pop、peek等操作。

第15章

队列

什么是队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。(先进先出)

实现队列

与栈类似:
数组每次被填满后,加入下一个元素时,把数组拓展成现有数组的两倍大小。

每次移除元素时,检测数组空余空间有多少。当数组里的元素个数只有整个数组大小的四分之一时,数组减半。

不同之处在于:

由于是先进先出,移除是从队列的最前端开始的。所以当我们移除数个数据后,队列数据是存储在数组的中间部分的。令队列数据的尾端数据ID为Num,首端数据ID为HeadIndex,则Num - HeadIndex为队列数据元素个数。

当队列数据元素个数为整个数组空间的四分之一时,数组减半,且队列数据左移至数组最左端。即Num-=HeadIndex;HeadIndex=0;

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

问题1:什么是时间复杂度和空间复杂度?

书本内容:增长函数表明问题大小(n)与希望优化的值之间的关系。

个人理解:书上并没有详细介绍时间复杂度与空间复杂度的概念,所以我去查阅了相关资料。时间复杂度是指执行这个算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。通俗讲,时间复杂度考虑的就是算法运行的时间,而这是与算法的效率与设计息息相关的。举例来说,如果有一个多重循环且必须执行到底的算法,那它的时间复杂度一定很高。空间复杂度则顾名思义,考虑的是算法需要占用的空间、需要占用计算机资源的多少。

问题2:什么是泛型?

书本内容:泛型可用于定义一个类,它保存、操作并管理直到实例化时才确定类型的对象
个人理解:泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。

问题3:管理链表中,哨兵结点的存在可以去掉处理第一个结点的特殊情形,哨兵结点的用法是怎么样的?

问题3解决方案:我在网上找到了一段介绍哨兵结点的文字:“哨兵节点(sentinel)是一个哑元节点(dummy node),可以简化边界条件。是一个附加的链表节点,该节点作为第一个节点,它的值域中并不存储任何东西,只是为了操作的方便而引入的。如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点。
很多情况下,需要处理当前节点的前驱节点,如果是没有哨兵节点的链表,对第一个节点,即头节点,没有前驱节点。如果不作特殊处理,就可能出错;如果对它特别对待,就会增加代码复杂性,还会降低程序效率。而如果有哨兵节点的话, 线性表的每个位置的节点都有前驱节点,因此可以统一处理。
当链表为空时,没有哨兵节点的链表的头节点为NULL,处理起来也和其他情况不同。带哨兵节点的链表,当其为一个空链表时,仅含哨兵节点,哨兵节点的指针域为空,和其他情况的表尾是一样的。”我还是更倾向于叫他虚位结点,它作为一个假的首结点,里面为空,真正链中第一个元素在第二个节点中,对链表中首位元素的插入和删除就可以在第一个结点和第二个结点之间进行,避免对第一个结点的特殊操作,提高效率。

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

问题1:不清楚LinkedStack中的pop方法。

T result = top.getElement();
top = top.getNext();
count-;

问题1解决方案:结合LinearNode代码理解,先将top中的元素获取并赋值给result,返回result,再用LinearNode中的getNext方法获取下一个元素到top中,这样实现了弹出元素的操作。

代码托管(https://gitee.com/li_jinquan/ljq/tree/master/src)

https://gitee.com/li_jinquan/ljq/tree/master/
20182335 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结_第1张图片

上周考试错题总结

上周无考试

点评过的同学博客和代码

本周结对学习情况
20182311

感悟

本周事情比较多,学习时间不足,需要及时调整,花更多时间和精力去调整。继续加油。

参考资料

《Java程序设计与数据结构教程(第二版)》

《Java程序设计与数据结构教程(第二版)》学习指导

你可能感兴趣的:(20182335 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结)