从周一到周五每天都看了十篇左右的博客,这周看了大概60多篇博客,首先看的就是关于搜索的,一些题解,思路讲解以及实现过程,然后看的笔记总结,学习到了很多方法和技巧,因自己笔记总结写的一直不太好,这周一直在翻看别人的笔记总结,希望能从中学习到一些新知识,扩充自己的知识面,更重要的是如何写好一篇博客,然后周四晚上打比赛遇到一些问题,编译器通过了,单提交显示The Limit Exceeded,阅读了几篇相关的博客,如何去避免The Limit Exceeded。然后就是几道排序,高精度的题目。
这周继续学习了搜索,通过老师讲解的几道例题,更加深刻和系统的认识如何使用以及其主要思想。这一块对我来说是比较难的内容,研究了ppt上的几道题,发现其思想基本一致,但让我自己写程序,我还是写不出来,为了更加深刻的认识,这周主要看了几篇关于搜索的博客,学习到了几种新的方法(爬山法,最佳优先算法,回溯法),巩固了基础,并更加深入学习了一下。
上一次因为没有电脑,没有参加cf竞赛,这周第一次参加,上面的题目前几道我还是有一战之力的,但有些题具体思维有了,但又不知道如何具体去实现他,后面的题竟直接懵逼了,可能以我现在的水平还够不到,做了一晚上勉强做出来两道题,但是一看排行榜,很多人都全部做出来了,我意识到自己与来自全世界高手的巨大差距,认识到必须提高并严格要求自己,争取以后可以做出更多的题目。
还有就是做第一题的时候第一次提交显示,结合看了的几篇博客,做了以下总结,如何去避免
1.要有循环中止条件。
因为没有一个中止条件,计算机会一直不断的去运算。
2.函数调用超时。
例如:递归调用因为会调用自身很多次,所以时间的复杂度是指数级别的。
3.优化程序算法。
在解决问题时,应尽量选择简单的方法,如果遇到这种情况,应换一个思路。
下面就是学习搜索需要用到的知识的一些整理,我觉得想要真正学好搜索,这些一定要掌握:
一.树
树是n个节点的有限集
结点 :包含一个数据元素及若干个指向其它结点的分支信息
结点的度 :一个结点的子树个数称为此结点的度
叶子结点 :度为0的结点,即无后继的结点,也称为终端结点
子结点 :一个结点含有的子树的根结点称为该结点的子结点
父结点 :若一个结点含有子结点,则这个结点称为其子结点的父结点
结点的层次 :从根结点开始定义,根结点的层次为1,根的直接后继的层次为2,以此类推
树的高度( 深度 ) :树中所有结点的层次的最大值
关于树和二叉树,下周会深入学习了解。
二.递归
递归老师在讲课时有提到过,在这里做一下的总结。
含义:函数调用本身( 自己调用自己)
构成递归的条件:①能将一个问题转换成一个更小的问题,且新问题与原问题解法相同②必须有递归出口( 否则会造成死循环)
递归函数的底层是由栈实现的,是系统帮我们写好的,可以直接使用
递归 = 递推 + 回溯
三.排序
(1)快速排序
上面总结了递归,刚好这里就需要用到递归
主要思想:分治
步骤:
1.确定分界点可以为a[l],a[(l+r)/2],a[r]或是随机
2.调整范围,使得第一个区间中的数小于等于x,第二个区间的值大于等于x
3.递归处理左右两段
(2)sort快排
sort是之前学STL的时候学习的,个人觉得sort非常好用。
使用sort函数需要头文件#include< algorihim>
模板:sort ( begin , end , cmp )
{ 参数begin:要排序的数组的起始地址
参数end:结束的地址( 最后一位要排序的地址的下一个地址)
参数cmp:排序的方法,可以从大到小,也可以从小到大,当不写该参数时,默认从小到大的排序方式}
这周主要学的就是广度优先搜索和深度优先搜索,根据做过的几道练习题,也知道了什么情况下用,什么情况下不能用,比如素数环那道题,从1到20任选数字,选过之后就不可再选,就是一步步罗列出所有可能,而且是1个数填完直接开始下一个,是一个典型的深度搜索的应用,所以,如果题目是选择了一种结果后又出现了多种结果,类似于树一样,每个树枝都有它的分叉,并且每种结果都可以得到最终答案,但也不应该看到差不多的题目就想到搜索,比如周四cf竞赛上的第一题,我首先想到的是用搜索去做,但是怎么试都感觉不对,最后用比较基础的代码就完成了,因此,不用做什么题都只想到搜索,方法固然重要,但效率也很重要
总的来说,这周学到很多,尤其是学了搜索以后,感觉知识面扩充了很多,也能应付一些更有难度的题目,下周就继续练习关于搜索的题目,巩固知识进一步提高自己,初步学习下一节数据结构内容。