20182307 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结
20182307 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结
目录
教材学习内容总结
- 第12章 算法分析 从算法效率角度分析了软件开发的目标,介绍了算法分析的概念,引进了增长函数与时间复杂度的概念。通过比较不同的算法的增长函数与时间复杂度来分析算法的效率。
- 第14章 栈 引进了栈这个“先进后出”的线性集合的概念,介绍了栈相关的push,pop,peek等操作。与继承、多态的知识相关联引出了泛型的概念,并以计算后缀表达式为例演示了栈的应用。
- 第15章 队列 引进了队列这个“先进先出”的线性集合的概念,介绍了队列的enqueue,dequeue等操作。介绍了循环数组解决队空队满情况的方法。
学习笔记:
- 计算机系统中最重要的资源之一是CPU时间。完成具体任务的算法效率是决定程序执行速度的一个主要因素。
- 增长函数显示了与问题大小相关的时间或空间利用率。
- 算法的阶由算法增长函数的主项决定。
- 处理器速度和内存不能弥补算法增长函数的上界。
- 集合是收集并组织其他对象的对象。主要分为两类:线性和非线性的。
- 栈是一个线性集合,处理方式是后进先出。
- 泛型的使用:可以定义一个类,它保存、操作并管理直到实例化时才确定类型的对象。
- 可用对象引用变量来创建链式结构。
- 链表由对象组成,其中每个对象指向表中的下一个对象。
- 队列是一个线性集合,处理方式是先进先出。
- 采用数组实现队列时,把数组看成是一个环,可以避免移动元素。
教材学习中的问题和解决过程
-
问题1:什么是时间复杂度和空间复杂度?
- 书本内容:增长函数表明问题大小(n)与希望优化的值之间的关系。
- 个人理解:书上并没有详细介绍时间复杂度与空间复杂度的概念,所以我去查阅了相关资料。时间复杂度是指执行这个算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。通俗讲,时间复杂度考虑的就是算法运行的时间,而这是与算法的效率与设计息息相关的。举例来说,如果有一个多重循环且必须执行到底的算法,那它的时间复杂度一定很高。空间复杂度则顾名思义,考虑的是算法需要占用的空间、需要占用计算机资源的多少。
-
问题2:什么是泛型?
- 书本内容:泛型可用于定义一个类,它保存、操作并管理直到实例化时才确定类型的对象
- 个人理解:泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。
-
问题3:怎么理解循环数组实现的队列?
- 书本内容:采用数组实现队列时,把数组看成是一个环,可以避免移动元素。
- 个人理解:如果数组的长度在初始化时是固定了的,那么在元素填充到最后一个空间时就无法再继续添加了,因为那会导致数组越界的情况。而如果用自动扩容来处理这样的情况,又会导致前面的空间被大大的浪费了。为了更好地解决这个问题,可以想象一个数组是一个环,头尾相连,如果元素填充到原先的“尾部”了的话,下一个填放位置就又回到了头部,即第一个位置,这样就避免了数组越界的问题,也解决了浪费空间的问题。
代码调试中的问题和解决过程
-
问题1:无法将字符串分隔开,取出想要取出的字符串并存入数组
- 原因分析:之前取出字符时使用的
charAt()
代码只能用于一个个的取出字符,如果想要取出多个字符即字符串就无法做到了,这就需要使用String类中的split方法了,它能够做到将字符串分割开来。代码为字符串变量.split("作为分割的标志","想要将字符串分割成的数量")
,后一个限定项可以省略 - 解决方案:用split方法分割字符串
- 原因分析:之前取出字符时使用的
-
问题2:递归实现二分法查找时,递归无法结束
- 原因分析:任何递归定义必须有一个非递归部分,它决定了递归结束的时机。而我的程序中,mid这个反复传入递归中的变量的值始终没有改动,它导致了我的程序在每一次递归时都不会出现任何变化,自然形成了“无穷递归”问题。
- 解决方案:修改代码,让mid的值在递归前发生变化。
-
问题3:打印语句时,顺序与预期不同
-
原因分析:在打印时,先调用了括号中优先级更高的size2方法,该方法中包含了一句输出语句与一句返回语句,所以主方法中打印时会先打印出size2方法中的打印语句,再打印主方法中的输出语句
代码托管
上周考试错题总结
上周无考试
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 209/209 | 2/2 | 9/9 | |
第二、三周 | 290/499 | 2/4 | 18/28 | |
第四周 | 516/1015 | 2/6 | 22/50 | |
第五周 | 2981/3996 | 2/8 | 32/82 | |
第六周 | 1498/5494 | 2/10 | 20/102 | |
第七周 | 1519/7013 | 2/12 | 51/153 |