关于入门算法学习的个人看法
老实说,我学习算法时间其实并不是很长,相比较其实是在一个刚入门的水平,所以只敢大概说下自己的一点点经验
对所处阶段的定位
我个人比较习惯于不同阶段层次的总结,可以很好的认识自我,避免被各种不同的学习路线带歪。
我针对自己情况大概总结了入门时的几个层次:
-
语法大概了解,对于一些简单题,题意可以搞懂,也有算法思路,但会陷入频繁报错,各种语法细节问题,代码没什么缩进,美观度差,不熟悉Oj这种平台是怎么玩的(oj大概只写过1-10题水平)
-
基本写代码时不咋会出现编译错误,有也只是手误,马上就能修改;但是对于循环,嵌套时边界掌握不好,经常搞混乱,数组操作时也常出现越界之类问题,出现问题后自己调试能力较弱,不容易找到问题所在。(Oj大概写了20题左右)
-
已经练过一段时间了,具有一定代码审美能力,能够完成一些普通的简单模拟题,出现一点细节问题也能够自己debug出,但是对于一些涉及算法,需要转换思维的题仍然很吃力,不是完全没有思路,就是暴力写出好多好多代码,然后还不一定能不能解决问题。(oj写了100-200多题)
-
从各种渠道接触了一些算法,各种排序算法,也看快排,大概有了模糊的时间复杂度的概念,看过些高精度算法,了解过一些贪心,搜索等等算法的大概含义,
但是顶多看过一些模板题,自己写的不多
或者写起来就没什么思路或死活调试不对,然后去看大佬题解,感觉模模糊糊理解了点
(已经开始接触一些洛谷等算法社区)
-
大量输入了各种基础算法题(或者跟课程或者书籍把基础部分算法过了一遍),对基础部分的算法题有了大概概念,能够灵活转换类似算法题之间的相似模式,熟练一些基础的板子或者思路(二分,前缀和,差分,位运算,双指针)。
(已经算是入门了,有大概的学习思路了)
以上是我大致写的,及供参考,括号里的题量之类的蒙着写的,不准勿喷
入门思路
其实从各阶段已经可以大概感觉出部分学习思路了,但只是概括性的感观的,下面准确的给出一部分我自己的想法。
- 熟悉C与C++的基础语法,规范自己的代码。
- C++其实只是当作C+STL库就好了,也就几个其他的语法特殊,其他一样的(STL库后来再说)
- 掌握基础的debug方法,遇到问题可以自己进行调试,找错误,去查究竟是算法本身问题,还是有些细节没考虑或者手误出问题。
- 刷过一部分OJ前面的基础题(不一定是咱学校oj),具有大概将算法思路转换为代码的能力。
算法学习
关于算法学习我建议按以下顺序接触
-
基础排序算法(冒泡 选择 插入 快速排序)
此部分我自己感觉实际里不一定用,但是学习练一段时间可以大概了解一些同一效果可以用不同思路解决的感觉,和一些算法思想(我也说不清),大概感受一些时间复杂度的概念。(不过我后来实际写的时候都直接用sort了(逃))
-
二分查找(其实好多算法书都会这个时候讲一部分高精度算法,也可以参考)
二分查找不仅仅是传统所说的查找某个具有单调性序列里的某个数,而是查找两端不同状态的分界点。
可以积累自己的代码习惯,不然每次都现场写,会容易出现很多边界的细节问题
-
双指针算法
-
前缀和 与 差分
-
位运算
-
离散化
-
递归与递推基础套路(顺便了解些dfs)
学习时还建议写题解和博客的习惯,遇到写的时候出问题后来看题解搞懂的,很有不用打一遍,自己配注释去解释,有时间自己还可以写个博客。
遇到问题很多交流可以解决很多(但是有些百度就能查到的不建议问)
大概就是以上了,后面我觉得我没什么能力说,自己还是个蒟蒻。。。。仅供参考。。