20182312 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结
教材学习内容总结
课本第12章 算法分析
(1)学习了算法效率分析以及时间复杂度中的大O记法
(2)学习了增长函数的比较,用于分析算法运行效率,增长函数表示问题大小与希望优化的值之间的关系,该函数表示算法的时间或空间利用率。这个比较是必要的,因为如果算法的运行效率低,使用更快的处理器也无济于事。
(3)循环,嵌套循环及方法调用的复杂度分析:首先要确定该循环体的阶次n,然后用该循环要运行的次数乘以它。
课本第14章 栈
(1)集合:一种聚集、组织了其他对象的对象,是一种隐藏了实现细节的抽象。
(2)栈:一个后进先出,先进后出的集合,其中常用方法为push(入栈)pop(出栈)peek(显示栈顶元素)isEmpty(判断是否为空)size(确定栈的元素数目)等并且,栈可以通过很多方法实现,如数组,链表(栈的链表实现是从链表的一端添加和删除元素)。
课本第15章 队列
(1)队列的元素是按FIFO方式处理的:第一个进入的元素,也就是第一个退出的元素,队列也可以通过数组和链表实现。同时有这几个操作:enqueue入队dequeue出队first显示队首isEmpty是否为空size元素个数
教材学习中的问题和解决过程
- 问题1:数组实现的队列和栈,当新元素加入到一个满的数据结构中时应该做些什么,因为毕竟数组是一个固定大小的数据结构。
- 问题1解决方案:
- (1)实现往集合添加一个元素的操作,如果集合为满,抛出一个异常。
- (2)实现add操作,该操作返回一个可由用户检查的状态标识符,一边查看该add操作是否成功
- (3)当需要时可扩展集合的容量。
- 问题2:数组实现的队列,向中间插入元素是不是很麻烦,需要把很多元素移位。
- 问题2解决方案:把数组看做环形的,可以出去在队列的数组实现中把元素移位的需要
- 问题3:老师上课所说的front和rear的位置重合时怎么判断到底是空还是满
- 问题3解决方案:这里记录一种新奇的方法,即记录rear和front移动的方向,从而确定它到底是空还是满。
代码调试中的问题和解决过程
- 问题1:在使用链表实现二叉排序树的时候链表莫得了。
- 问题1解决方案:在私有变量中定义一个root保存好根节点,根节点一丢整个链表就没了。
- 问题2:用链表实现队列和栈似乎有区别
- 问题2解决方案:我们必须要操作链表的两端,于是,除了一个指向链表首元素的引用(称为head)之外,还需要跟踪另一个指向链表末元素的引用(称为tail)。还要用一个整型变量count来跟踪队列中的元素数。
代码托管
(
)
点评过的同学博客和代码
其他(感悟、思考等,可选)
这一周学的东西就概念或者说原理来说是不难的,但是极其重要,相当于是一种工具,我们这几周做的实验和实践其实都是与这息息相关的,而我们在学习的过程中着重于链表对于栈和队列的实现,链表如果能学通,后面的实验和实践应该好做不少。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 130/130 | 2/2 | 23/23 | |
第二周 | 451/581 | 3/5 | 42/67 | |
第三周 | 451/581 | 3/5 | 42/67 | |
第四周 | 617/1068 | 2/7 | 28/95 | |
第五周 | 632/1700 | 2/9 | 17/112 | |
第六周 | 666/2366 | 1/10 | 22/134 | |
第七周 | 1666/4032 | 3/13 | 42/178 |
-
计划学习时间:50小时
-
实际学习时间:42小时
-
改进情况:在编代码之前要想很久相关的逻辑和算法,现在逻辑的思考比敲代码重要了。