深入学习算法的一点拙见
今天实在是头脑不听使唤了,没力气看书,写代码了。写点总结吧。 都说算法是内功,究竟练到什么程度才算修成了呢? 为什么要学习,强化算法? 首先强调的是,下面的原因均是建立在算法熟练到一定程度后的效果。不熟的话,未见得能达到效果。这些原因很现实。但很多程序员却不知道或不以为然。
- 比较世俗的方面,顶级软件公司笔试,面试会问到。别说你不想去谷歌,百度,微软,如果真的没想过,我希望你能想想自己是否具备进入的实力。如果还是没兴趣想,那就忘了这条,看看下面的原因吧。
- 如果算法熟练,能显著提高看代码的速度,越是工作久了,越会发现很多时候是在读别人写的代码,然后在其基础上追加功能,或修改bug。所以这是很现实的技能。
- 算法操练上手快,注意只是快,但不见得容易。因为练习省去了界面等操作,只利用编译器最基本的功能,非常适合初学者,编程环境不十分熟练的人来学习,别小看这一点,这能让你不论在家,在同学的电脑上,甚至在网吧,只要你想操练都是能迅速找到办法写程序实现的。
- 难学,有区分度,正因为难,属于内功级别的学习,不是工具型的学习,所以她经久不衰,这项技能能让你不论什么时候都能作为一个亮点技能展示,并运用。比如眼下学python的人不少,但如果再出现更进步,高效的语言,而且这是完全有可能的,又需要重新学习,那什么才是被各种纷繁语言覆盖的,能让你拥有后在短时间能适应任何语言层面的转换工作,更为通用的技能呢?无疑,数据结构+算法是其中一个,而且是非常重要的一项技能。而更为重要的是,算法这种技能,最实实在在的在于他的优势持久性,周围的人如果没有经过大量算法编码训练,只是看过书写过简单算法的人是很难短期内超越你的。也就是说,这项技能越高越能保证你的能力、水平在社会上具有唯一性。即:稀缺人才。
- 很多简单的UI操作,短期培训班出来的照着做也能做出来很炫的效果,要佩服微软的封装工作,把UI设计大大简化了。
- 对编程语言的基本功能会得到大量强化,比如操作符重载,数组,指针的运用,类的构建,对字符串的操作,以及STL,泛型的理解、运用。这里我想你应该看到了学习算法的过程是如何与计算机应用建立起了联系,因为你肯定在写程序时无数次与这些内容打交道,当然,不深入学习算法,也同样可以获得这些知识,而且.NET,Java,已经封装了非常多的这类基础操作,使得字符串处理变得容易多了。这就要看你的风格,需求了。这里我只是介绍深入学习算法能带来的好处,至于不深入学习有没有坏处,我不做评价。注意"深入"二字的修饰作用,如果没学过基本的数据结构,甚至数组、链表都没搞懂区别的话,那做程序员一定是不行的。迟早会遇到瓶颈,而且很快。
- 提供了足够的可扩展空间。对计算机科学的深层研究必备武器,比如操作系统,搜索引擎,编译器等等。要分析linux源代码,会发现,操作系统在内存管理,进程,线程管理,文件管理,协议栈中,运用了大量算法实现,如果基本算法都不理解,甚至不知道,很难说分析源代码能有多深入。因为看不懂啊。这时会有种遇到瓶颈的感觉。类似玩劲乐团的人,玩到一定程度,眼睛能跟上,但手速跟不上了。
- 注意,算法虽然是内功,但不是全部,还有很多知识是非常重要的,值得学习的,跟算法关系不太大的。比如设计模式,面向对象思想。所以算法学习到什么程度,自己酌情处理。毕竟越深入,会发现数学知识可能遇到瓶颈,但我想大多数人,只要不是搞科学研究,是不必深入到写龙格-库塔,FFT等算法的地步的。
- 总之深入学习算法的目的,对于程序员来说,是为了提高编程效率,提高解决问题的效率,能达到需要算法时,自己实现或找来能用的算法,很容易的嵌入到自己的程序中即可。
一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的, 主要时间是花在思考算法上,不是花在写程序与debug上。 下面给个计划你练练: 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简) 7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式. 8. 调用系统的qsort, 技巧很多,慢慢掌握。 9. 任意进制间的转换 第二阶段:练习复杂一点,但也较常用的算法。 如: 1. 二分图匹配(匈牙利),最小路径覆盖 2. 网络流,最小费用流。 3. 线段树. 4. 并查集。 5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 6. 博弈类算法。博弈树,二进制法等。 7. 最大团,最大独立集。 8. 判断点在多边形内。 9. 差分约束系统. 10. 双向广度搜索、A*算法,最小耗散优先.时间: 人都是总结,展望容易,靠想靠说当然容易些,尤其是技术人员。真的去做,去完成却是最难的。所以上面说了一大堆,真正最后能实现多少,都是未知数。定些计划,往往能激发自己去完成,如果再把这个计划公开,那就更能加上点督促的力量。2-3年吧,是个比较合理的估计,那时工作也快满5年了。应该有一定积累了,也是质变的时候了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步