20182322 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结
教材学习内容总结
一、查找
1、线性查找:从表头开始,依次将每个值与目标元素进行比较,最后找到目标或者到达表尾发现目标不存在于组中。
2、二分查找:如果查找池中的数据项有序,从表的中间开始查找,如果中间项不是所需值,根据目标与中间元素的大小比较确定元素在哪侧,在该侧继续从中间开始查找,每次排除一半的元素,确定目标元素。(二分查找必须保证数据项有序)
二、排序
1、选择排序:分别将每个值放到排好序的最终位置,从而完成一组值的排序。
平均时间复杂度为O(n2),稳定。
2、插入排序:重复地将一个具体的值插入到表中已有的子序列中,从而完成一组值的排序。每次将每个待排序的元素插入到有序子段中合适位置,直到表中全部元素均有序为止。
平均时间复杂度为O(n2),稳定。
3、冒泡排序:重复地比较表中的相邻元素,如它们呈逆序则交换它们。
平均时间复杂度为O(n2),稳定。
4、快速排序:根据一个任意选定的划分元素来对表进行划分,然后再递归地对划分元素两边的子段进行排序,从而完成对表的排序。
平均时间复杂度为O(nlog2n),不稳定。
5、归并排序:递归地对分表,直到每个子表只含有一个元素为止,然后再将子表按序合并,从而完成对表的排序。
平均时间复杂度为O(nlogn),稳定。
教材学习中的问题和解决过程
- 问题1:归并算法里对两个子表合并成一个更大的有序表时,两个表如果是65 90,28 100.怎么归并成一个组,如果就是把两个组归并起来,就会是65 90 28 100,并不能达到通过小的有序的数组来归并成有序的大数组的目的?
- 问题1解决方案:上网查阅资料明白了书上所提到的marge方法里面temp数组的意义。他把两个子表里的较小的元素先复制到temp组里,并不是把两个有序的子表直接组合起来,这样通过在temp里不断读取剩余子表里较小元素来填充到temp数组里,最后用一个for循环把temp里的数组复制到原数组里面去,完成排序。
- 问题2:书中快速划分提到需要一个合适的划分元素,推荐随机抽取三个值,从中选择中间值作为划分元素。我的问题是这样做不是增加了算法的复杂度吗(虽然复杂度阶别并没有改变),为什么要采取这种方法?
- 问题2解决方案:经过思考,我认为虽然采取第一个成员作为划分元素会减少上述步骤,但如果选择的成员不合适,过大或者过小,都不能趋近于让划分元素左右两边成员达到接近的结果,这样到了后期会增加多元素一边的计算步骤,相比之下采取随机抽样的中位数则会减少这一方面浪费的计算步骤了。
- 问题3:不是很理解有关快速排序这一方法
- 问题3解决方案:书上介绍的方法是先选择表中的一个元素作为划分元素,我觉得还是以第一个元素作为划分元素更有利于理解。以第一个元素作为枢轴,将后面的元素依次与其比较,较小的放在枢轴前,较大的放在枢轴后。将所有元素都比较结束后,以枢轴为中心将表分成两个部分,每个部分再次重复这一操作。直至每个划分段只有一个元素,递归应用给每一边后,则整个数组有序,从而实现了排序的过程。归并算法中也采取了这一逻辑。
代码调试中的问题和解决过程
- 问题1:程序13.1中重写了toString方法,不理解为何重写这一方法,对toString方法的掌握不清楚。
- 问题1解决方案:我先在网上了解了一下toString方法,这一方法的作用是把一个逻辑值转换为字符串,并返回结果。主要是返回结果这一项,在这个重写的方法中,toString返回了姓氏,名字和手机号码,这三个变量原本就是String类型,在重写的方法中直接返回,给新的Contact对象。
- 问题2:在编写SearchPlayerList.java时程序无法在idea里run,解决后我删掉了target的last的语句,输出结果就变成了Player not found,当时没有理解。
- 问题2解决方案:不能run是因为打代码的时候把main打错了,没有主函数是无法运行的。在这个程序里compare是的方法是Searching类里的lineraSearch方法。反复实验后我才注意到这个方法里if判断循环是镶嵌在linearSearch里面的。当只有一个元素满足的时候index++是2仍然满足while里的index<data.length的条件,内循环不能输出,但是外循环也无法停止。只有有两个条件满足导致index++是3不满足外循环时才会执行while这个外循环的else也就是return result。
代码托管
上周考试错题总结
- 没有考试
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
-
博客中值得学习的或问题:
- 排版工整
- 对问题都深入研究
-
代码中值得学习的或问题:
- 代码有自己的理解
- 代码排列不大美观
-
基于评分标准,我给本博客打分:9分。得分情况如下:
-
正确使用Markdown语法+1.
-
教材学习中的问题和解决过程+2.代码调试中的问题和解决过程+2.
-
感想,体会不假大空+1.
-
错题学习深入+1.
-
点评认真.课后题有验证+1.
-
进度条有记录+1.
点评过的同学博客和代码
- 结对学习情况
其他(感悟、思考等,可选)
- 这章的学习主要是一个思考的过程,只要把逻辑弄明白,学习起来相对之前不是那么的难。
- 这章学习的东西要多应用,才能熟练掌握。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 59/200 | 2/2 | 20/20 | |
第三周 | 292/331 | 2/4 | 20/40 | |
第四周 | 677/969 | 2/6 | 20/60 | |
第五周 | 661/1265 | 2/8 | 20/80 | |
第六周 | 1299 /2554 | 2/10 | 20/100 | |
第七周 | 1500/4054 | 2/12 | 20/120 | |
第八周 | 2511 / 6565 | 2/14 | 20/140 |
-
计划学习时间:20小时
-
实际学习时间:20小时