20182319 2019-2020-1 《数据结构与面向对象程序设计》第周八学习总结
目录
教材学习内容总结
这一周,我们学习的是第14章,主要学习到的是关于查找和排序的的知识。
- 首先,我们学习到的是关于查找的知识,在这当中,我们学习了顺序查找、折半查找、散列查找(即哈希查找,学到了线性探查法和链地址法)对于顺序查找,它是一种比较简单也比较暴力的算法,其简单在于它的代码实现比较简单,就是两个for循环就搞定了,而且它的条件也是十分简单的,嗯~,的确挺简单的,简单到没有条件(我怀疑你在搞事情)。但是,简单的也不一定是最好的,简单的东西大部分实现起来也比较暴力,于是,它的程序就有一个特点,那就是慢,所以我们就可以提到我我们的折半查找法了,这种算法的一个特点就是它十分快,相比于线性查找的O(n),它的复杂度是O(logn)这样的好处就是我们在运行的时候可以活动大量的时间,比如一个数量达到1000的数据,我们一个是O(1000)一个是O(10)两者差距显而易见,如果一具算法比普通暴力的算法要快很多的话,那么它一定是用了技巧的,而用技巧的东西一般来说都会需要一些条件或者在其它比如说空间上有一些牺牲,我们的折半查找也有一个限制,就是它的原数列一定要是一个已经排好序的队列,否则就会实现不了。最后一个就是我们的哈希查找法了,这是一个十分有趣的查找方法,它也是一个有限制的方法,不过与折半不同的是它不是对原数列有什么要求,而是对一开始的程序运行有一定的要求,它要求程序开始的时候就应该用与它自己相配套的数组输入,或者在用的时候再把目标数组放到这个数组中去,然后它才能进行工作,而对于它的复杂度则是一个比较迷的东西,因为它的复杂度不是一个固定的,而且是从1到n不确定,当然,这也是取决于你的那个哈希函数的,对于这个函数的不同定义,我们可以把它的复杂度降到很低,当然,那个时候就可能对空间的复杂度有很高的要求了。
- 然后是排序,我们主要学习的排序方法是插入排序、选择排序、冒泡排序、快速排序和归并排序(也就是我们平常说的桶排),其实还有提到希尔排序,但那个东西有点高级了,平常用的话还是不一定用得好。所以就略过不提。然后看到的插入、选择和冒泡,这三个是比较基础的排序,其实也是比较慢的方法,然后我们可以考虑到的是快速排序和归并排序,这两个排序就比较快了,到少从理论上来说是这样。当然,它们实现起来就可能会困难一点,我们一般也采用递归的方式,这样还是可以活动一些工夫的。
教材学习中的问题和解决过程
- 问题1:选择排序是不是一种稳定的算法?
- 问题1解决方案:对于这个问题,我的想法其实是经历过一个转变的,本来,我以为所谓稳定,就是一个程序运行到最后的结果只要满足相同的数相对前后关系不变就好了,然而老师的讲解让我觉得我自己很天真,事实上只有在一整个过程中都不曾发生相对前后关系改变的才能叫做稳定,于是我稳稳地跪了。答案是:不是
代码调试中的问题和解决过程
- 问题1:从理论上来说归并排序应该算这几个中的王者了,因为它的复杂度从哪个方面来说都特别低,至少可以不慢于快速的。但事实上它却是这样的比别人少了一个数量级的运算量却还比别人慢,这就有点尴尬了。
- 解决方法:这个十分明显已经超出了我的能力范围,我没有办法,只好去找同学和老师帮忙,发现其实大部分同学也有这个问题,我不是个例,这就非常有研究价值了,然后就去问了一下老师,开始想的是数据太小,于是从1000开到了10000发现还是这样,于是又开了100000依然没有什么用,但也没有继续尝试了,因为开到1000000的预测时间是10000s也就是3个小时,这还只是一个小的排序一个程序下来可能得要5天,
我疲惫地笑了所以没有办法尝试,然后老师给出的答复是可能是因为不同的程序所用的方法不同,我可能碰巧用了一种慢的或者是程序本身的问题。
代码托管
结对及互评
评分:12
评价
- 博客中值得学习的或问题:
他这篇博客中那个如下问题没有看到如下的内容。
点评过的同学博客和代码
- 本周结对学习情况
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 62/62 | 1/1 | 30/30 |
第二周 | 188/250 | 4/5 | 17/47 |
第三周 | 619/869 | 1/6 | 18/65 |
第四周 | 386/386 | 2/8 | 20/82 |
第五周 | 909/1295 | 0/8 | 18/100 |
第六周 | 1470/2765 | 1/9 | 25/125 |
第七、八周 | 1810/4575 | 3/12 | 33/158 |