20182334 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结
20182334 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结
教材学习内容总结
第八周学习了各种查找的方法和排序的方法。
查找:顺序查找、折半查找、二叉排序树查找、散列查找。
排序:选择排序、插入排序、快速排序、冒泡排序、归并排序等。
知识点很多,也比较繁琐,目前来说,我还没有完全学懂,虽然理论知识都知道,都清楚,但具体用代码实现感觉还是有点困难和无力的。
还学习了ASL计算平均查找长度,关于ASL(平均查找长度)的简单总结这篇博客主要讲了哈希查找的ASL计算过程和方法,我看了后感到收获颇多,故分享在这里。
还学习了用理论知识写出用快速排序排出后的结果,也就是用计算机的思维做排序,更充分的了解了快速排序。
各种排序或查找的时间复杂度。
教材学习中的问题和解决过程
-
问题1:在课本中有用到comparable定义数据的类型,我感到很不解,comparable是一个接口,为什么会用来定义一个类型呢?
-
问题1解决方案:又用jdk api查找了一遍comparable:
之后我发现其实他用comparable定义类型其实和之前学的泛型
差不多,当传参传进去为int型的时候,没有报错,运行出来的结果也是int型,当传参传进去为String型的时候,运行出来的结果是String型。
所以我感觉基本和泛型类似,作为一个可以后面改变、灵活的类型定义。
-
问题2:没有学明白快速排序的原理,快排过程中的基点怎么找,或者说之后怎么换,还是比较模糊。
-
问题2解决方案:为了解决我的这个问题,我再次进行自学,上完找相关资料,发现了一篇博客写的很好:快速排序(java实现)
上面这张图解释了基准点的问题,一般为了方便,都定义第一位数为基准点,后面的变化都是依靠这个基准点来变化的。
上面这张图显示了怎么换,从基准点之后的一位数开始,先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们,交换很多遍之后,就完成了排序,这种排序方法效率很高,提高计算机的效率。
-
问题3:老师教归并排序的时候自己跑神了,所以不知道如何做归并排序。
-
问题3解决方案:还是自学,上网找博客:Java实现归并排序-有图有真相这篇博客同样讲的很仔细。一张图基本就解决了我的问题:
这张动图讲的是将无序的一串数分离开变成多段数组,之后在各自数组里排序,之后两两合并,再重新排序,如此往复,最后成为一整个数组,那么输出出来的时候就是有序的了。
代码调试中的问题和解决过程
-
问题1:在用递归的时候出现问题,想要查找的位置总是少一位。
-
问题1解决方案:经过结对伙伴的纠正才发现原来我传回来的是数组下标,所以总是减一。之后我把返回值加一,这样就能准确的返回对应位置的值。
- 问题2:折半查找为什么必须要有序?
- 问题2解决方案:
上面这一些列图可以看到,所谓折半就要找中间的位置,然后与所要找的值比大小,之后再确定折半后的第一个值和最后一个值,所以想要确定,就必须要有序,有序之后才能比较。
代码托管
上周考试错题总结
上周无考试
点评过的同学博客和代码
其他(感悟、思考等)
通过学习数据结构,我发现自己java还有很多问题,比如各种定义或者类型的调用,再或者是用接口来做实验。在学习节点的时候,Node方法还是不熟练,只是会用,但里面的内容还是不是很清楚,所以还得加强练习。至于数据结构方面,我能理解里面的内容,但不知道如何用代码实现,这就让身为程序员的我,很难。可能是学习java和数据结构的时间太紧凑,所以很多内容老师讲完我还没消化就讲新的内容了,或者老师有些东西就不讲,全靠自学,自学也还行,但是真的没时间!!只有假期里看能不能再巩固的学一次,目前尽力跟上老师的脚步。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 212/212 | 2/2 | 17/17 | |
第二周 | 132/344 | 2/4 | 17/34 | |
第三周 | 689/1033 | 1/5 | 23/67 | |
第四周 | 664/1697 | 2/7 | 20/87 | |
第五周 | 586/2283 | 2/9 | 20/107 | |
第六周 | 500/2783 | 1/10 | 26/133 | |
第七周 | 2143 /4928 | 2/12 | 40/173 | |
第八周 | 3272 /8200 | 1/13 | 40/213 |
-
计划学习时间:29小时
-
实际学习时间:40小时
-
改进情况:不妥协,死磕到底!